informasi kontak saya
Surat[email protected]
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Transaksi tingkat basis data
Pada tingkat basis data, transaksi adalah serangkaian operasi yang semuanya berhasil dijalankan atau tidak ada satupun yang dijalankan.
Empat karakteristik utama transaksi database
Transaksi ulang
Transaksi Redis adalah sekumpulan perintah. Semua perintah dalam suatu transaksi akan diserialkan dan serangkaian perintah akan dieksekusi secara satu kali, berurutan, dan eksklusif.
MULTI
Mulai transaksi;EXEC
Perintah tersebut memicu transaksi;
Multi, Eksekutif, buang
masukan transaksi dariMulti
Saat perintah dimulai, perintah yang dimasukkan akan dimasukkan ke dalam antrian buffer perintah satu per satu dan tidak akan dieksekusi hinggaExec
Setelahnya, Redis akan mengeksekusi perintah pada antrian buffer perintah sebelumnya secara berurutan.Selama proses pembentukan tim, Anda bisa lolosdiscard
Ayo serahkan tim.
contoh
127.0.0.1:6379> set t1 1
OK
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379(TX)> set id 12
QUEUED
127.0.0.1:6379(TX)> get id
QUEUED
127.0.0.1:6379(TX)> incr t1
QUEUED
127.0.0.1:6379(TX)> incr t1
QUEUED
127.0.0.1:6379(TX)> get t1
QUEUED
127.0.0.1:6379(TX)> EXEC
1) OK
2) "12"
3) (integer) 2
4) (integer) 3
5) "3"
meninggalkan transaksi
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379(TX)> set name z3
QUEUED
127.0.0.1:6379(TX)> set age 29
QUEUED
127.0.0.1:6379(TX)> incr t1
QUEUED
127.0.0.1:6379(TX)> DISCARD
OK
Semua duduk bersama
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379(TX)> set name z3
QUEUED
127.0.0.1:6379(TX)> get name
QUEUED
127.0.0.1:6379(TX)> incr t1
QUEUED
127.0.0.1:6379(TX)> get t1
QUEUED
127.0.0.1:6379(TX)> set email
(error) ERR wrong number of arguments for 'set' command
127.0.0.1:6379(TX)> exec
(error) EXECABORT Transaction discarded because of previous errors.
Melihat:
Kumpulan perintah berisi instruksi yang salah (perhatikan bahwa itu adalah kesalahan sintaksis). Semuanya terhubung dan semuanya gagal.
Setiap ketidakadilan ada pemiliknya, setiap hutang ada pemiliknya
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379(TX)> set age 11
QUEUED
127.0.0.1:6379(TX)> incr t1
QUEUED
127.0.0.1:6379(TX)> set email [email protected]
QUEUED
127.0.0.1:6379(TX)> incr email
QUEUED
127.0.0.1:6379(TX)> get age
QUEUED
127.0.0.1:6379(TX)> exec
1) OK
2) (integer) 5
3) OK
4) (error) ERR value is not an integer or out of range
5) "11"
Melihat:
Untuk kesalahan runtime, yaitu kesalahan non-tata bahasa, perintah yang benar akan dijalankan, dan perintah yang salah akan menghasilkan kesalahan.
Ringkasan
Di antara perusahaan-perusahaan yang ada, 80% perusahaan sebagian besar menggunakan layanan Redis yang berdiri sendiri. Dalam skenario sebenarnya, Redis pada satu node rentan terhadap risiko.
menghadapi masalah:
- kerusakan mesin. Kami menyebarkan ke server Redis. Ketika terjadi kegagalan mesin, kami perlu bermigrasi ke server lain dan memastikan bahwa data disinkronkan.
- Kemacetan kapasitas. Ketika kita perlu memperluas memori Redis, dari memori 16G ke 64G, satu mesin pasti tidak akan mampu memuaskannya. Tentu saja Anda dapat membeli mesin 128G baru.
Larutan
Untuk mencapai kapasitas penyimpanan yang lebih besar dari database terdistribusi dan menahan akses bersamaan yang tinggi, kami akan menyimpan data dari database terpusat asli di beberapa node jaringan lainnya.
Melihat:
Untuk mengatasi masalah satu node ini, Redis juga akan menyebarkan banyak salinan data ke node lain untuk direplikasi guna mencapai ketersediaan Redis yang tinggi dan pencadangan data yang berlebihan untuk memastikan ketersediaan data dan layanan yang tinggi.
Apa itu replikasi master-slave
Replikasi master-slave mengacu pada penyalinan data dari satu server Redis ke server Redis lainnya. Yang pertama disebut node master, dan yang terakhir disebut node slave. Replikasi data bersifat satu arah, dan hanya dapat dilakukan dari node master ke node slave.
Peran replikasi master-slave
Tulis file konfigurasi
Buat redis6379.conf baru
include /usr/local/redis-7.2.4/redis.config
pidfile /var/run/redis_6379.pid
port 6379
dbfilename dump6379.rdb
Buat redis6380.conf baru
include /usr/local/redis-7.2.4/redis.config
pidfile /var/run/redis_6380.pid
port 6380
dbfilename dump6380.rdb
Buat redis6381.conf baru
include /usr/local/redis-7.2.4/redis.config
pidfile /var/run/redis_6381.pid
port 6381
dbfilename dump6381.rdb
Mulai tiga server redis
./redis-server ../redis6379.conf
./redis-server ../redis6380.conf
./redis-server ../redis6381.conf
Lihat proses sistem
[root@localhost src]# ps -ef |grep redis
root 40737 1 0 22:05 ? 00:00:00 ./redis-server *:6379
root 40743 1 0 22:05 ? 00:00:00 ./redis-server *:6380
root 40750 1 0 22:05 ? 00:00:00 ./redis-server *:6381
root 40758 40631 0 22:05 pts/0 00:00:00 grep --color=auto redis
Periksa status berjalan dari tiga host
#打印主从复制的相关信息
./redis-cli -p 6379
./redis-cli -p 6380
./redis-cli -p 6381
127.0.0.1:6379> info replication
127.0.0.1:6380> info replication
127.0.0.1:6381> info replication
Dilengkapi dengan database slave tetapi tidak dengan database master
Format sintaksis:
slaveof <ip> <port>
Contoh:
Dieksekusi pada 6380 dan 6381.
127.0.0.1:6380> SLAVEOF 127.0.0.1 6379
OK
Menulis di host dan membaca data di slave
set k1 v1
Replikasi master-slave dapat dibagi menjadi 3 tahap
Proses penyalinan secara kasar dibagi menjadi 6 proses
info replication
# Replication
role:slave
master_host:127.0.0.1
master_port:6379
master_link_status:up
4. Kirim perintah ping
Setelah koneksi berhasil dibuat, node budak mengirimkan permintaan ping untuk komunikasi pertama.
memengaruhi:
- Deteksi apakah soket jaringan antara master dan slave tersedia.
- Deteksi apakah node master saat ini dapat menerima perintah
ASD.
Jika parameter requirepass diatur pada node master, verifikasi kata sandi diperlukan. Node budak harus mengkonfigurasi parameter masterauth untuk memastikan bahwa kata sandi sama dengan node master untuk lolos verifikasi; jika verifikasi gagal, replikasi akan dilakukan dihentikan dan node budak akan memulai kembali proses replikasi.
Sinkronisasi kumpulan data.
Setelah koneksi replikasi master-slave berkomunikasi secara normal, ketika replikasi dibuat untuk pertama kalinya, node master akan mengirimkan semua data yang disimpannya ke node slave. Bagian operasi ini adalah langkah terpanjang.
Strategi sinkronisasi master-slave
Ketika master dan slave baru saja terhubung, sinkronisasi penuh dilakukan; setelah sinkronisasi penuh selesai, sinkronisasi tambahan dilakukan. Tentu saja, jika perlu, budak dapat memulai sinkronisasi penuh kapan saja. Strategi redisnya adalah, apa pun yang terjadi, sinkronisasi tambahan akan dilakukan terlebih dahulu, dan jika tidak berhasil, mesin budak akan diminta untuk melakukan sinkronisasi penuh.
Misalnya
menyimpan cache
set name jjy
Perintah perekamannya adalah
$3 r n
set r n
$4 r n
name r n
$5 r n
jjy r n
Mengimbangi | 1000 | 1001 | 1002 | 1003 | 1004 | 1005 | 1006 | 1007 | 1008 |
---|---|---|---|---|---|---|---|---|---|
Nilai byte | $ | 3 | R | N | $ | 4 | N | A | M |
7. Perintah disalin terus menerus.
Ketika node master menyinkronkan data saat ini ke node budak, proses pembuatan replikasi selesai. Selanjutnya, node master akan terus mengirimkan perintah tulis ke node slave untuk memastikan konsistensi data master-slave.
Kerugian dari replikasi master-slave Redis
Ketika host Master down, kita perlu menyelesaikan saklar secara manual.
Masalah paparan:
Setelah node master mati dan layanan tulis tidak dapat digunakan, Anda perlu beralih secara manual, memilih ulang node master, dan mengatur hubungan master-slave secara manual.
Teknologi peralihan master-slave
Ketika server master mati, server budak perlu dialihkan secara manual ke server master, yang memerlukan intervensi manual, memakan waktu dan tenaga, dan juga akan menyebabkan layanan tidak tersedia untuk jangka waktu tertentu.Ini bukan pendekatan yang direkomendasikan, lebih sering kita memberikan prioritasModus penjaga。
Ikhtisar Penjaga
Mode sentinel adalah mode khusus. Pertama, Redis menyediakan perintah sentinel. Sebagai sebuah proses, Sentinel akan berjalan secara independen. Prinsipnya adalah sentinel memantau beberapa instance Redis yang berjalan dengan mengirimkan perintah dan menunggu server Redis merespons.
Peran penjaga
Buat file sentinel-26379.conf baru
#端口
port 26379
#守护进程运行
daemonize yes
#日志文件
logfile "26379.log"
sentinel monitor mymaster localhost 6379 2
parameter:
sentinel monitor mymaster 192.168.92.128 6379 2 Arti konfigurasinya adalah: node sentinel memonitor node master 192.168.92.128:6379. Arti dari 2 yang terakhir terkait dengan penentuan kesalahan node master: setidaknya diperlukan 2. Hanya ketika dua node sentinel setuju, kegagalan node master dapat ditentukan dan failover dapat dilakukan.
Buat file sentinel-26380.conf baru
#端口
port 26380
#守护进程运行
daemonize yes
#日志文件
logfile "26380.log"
sentinel monitor mymaster localhost 6379 2
Buat file sentinel-26381.conf baru
#端口
port 26381
#守护进程运行
daemonize yes
#日志文件
logfile "26381.log"
sentinel monitor mymaster localhost 6379 2
Memulai simpul penjaga
redis-sentinel sentinel-26379.conf
Lihat status simpul sentinel
[root@localhost src]# ./redis-cli -p 26379
127.0.0.1:26379>
127.0.0.1:26379>
127.0.0.1:26379> info sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=192.168.66.100:6379,slaves=2,sentinels=3
fase pemantauan
Melihat:
- sentinel (sentinel 1)----->Memulai info ke master (master) dan slave (slave) dan dapatkan informasi lengkapnya.
- sentinel (sentinel 2)----->Mulai info ke master (master), Anda akan mengetahui informasi sentinel yang ada (sentinel 1), dan terhubung ke slave (slave).
- sentinel (sentinel 2)----->Memulai berlangganan ke sentinel (sentinel 1).
Tahap pemberitahuan
Sentinel terus mengirimkan notifikasi ke master dan slave untuk mengumpulkan informasi.
fase kegagalan
Pada tahap notifikasi, jika notifikasi yang dikirim oleh sentinel tidak mendapat respon dari master, maka master akan ditandai sebagai SRI_S_DOWN dan mengirimkan status master ke setiap sentinel. Ketika sentinel lain mendengar bahwa master telah meninggal, kata mereka Saya tidak percaya, saya juga akan memeriksanya dan mengirimkannya. Hasilnya dibagikan kepada masing-masing penjaga. Ketika setengah dari penjaga mengira masternya mati, mereka akan menandai masternya sebagai SRI_0_DOWN.
Inilah pertanyaannya:
Saat ini, master harus diganti.
Bagaimana cara memilih
Jalan:
Penjaga mana pun yang saya terima pemberitahuan pemilunya terlebih dahulu akan memilihnya.
Hilangkan beberapa kasus:
Ringkasan
Menunjukkan kemampuan pemantauan dan failover otomatis Sentinel ketika node master gagal.
Tunjukkan kegagalan
Gunakan perintah kill untuk mematikan node master
ps aux |grep redis
kill -9 pid
Lihat informasi simpul sentinel
Jika Anda segera menggunakan perintah info Sentinel pada node sentinel untuk melihatnya.
[root@localhost src]# ./redis-cli -p 26379
127.0.0.1:26379> info sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=127.0.0.1:6381,slaves=5,sentinels=3
Melihat:
Anda akan menemukan bahwa node master belum dialihkan, karena sentinel memerlukan waktu untuk mendeteksi kegagalan node master dan mentransfernya.
Mulai ulang simpul 6379
[root@localhost src]# ./redis-cli info replication
# Replication
role:slave
master_host:127.0.0.1
master_port:6381
master_link_status:down
File konfigurasi akan ditulis ulang
Selama fase failover, file konfigurasi node sentinel dan master-slave akan ditulis ulang.
include /usr/local/redis/redis.conf
pidfile "/var/run/redis_6379.pid"
port 6379
dbfilename "dump6379.rdb"
# Generated by CONFIG REWRITE
daemonize yes
protected-mode no
appendonly yes
slowlog-max-len 1200
slowlog-log-slower-than 1000
save 5 1
user default on nopass ~* &* +@all
dir "/usr/local/redis"
replicaof 127.0.0.1 6381
Kesimpulannya
Redis memiliki tiga mode cluster
Kekurangan Mode Penjaga
kekurangan:
Ikhtisar mode klaster
Cluster Redis adalah cluster layanan terdistribusi yang terdiri dari beberapa grup node master-slave. Cluster ini memiliki fitur replikasi, ketersediaan tinggi, dan sharding.
Keuntungan dari klaster Redis
Konstruksi cluster Redis memerlukan setidaknya 3 node master. Kami membangun 3 master di sini, masing-masing dengan node slave, dengan total 6 node Redis;
Konstruksi klaster
Buat 6 node redis berbeda dengan nomor port masing-masing 6379, 6380, 6381, 6382, 6383, dan 6384.
Melihat: File dump.rdb dan appendonly.aof harus dihapus sebelum disalin.
1. Buat file konfigurasi baru
Buat file redis6379.config, redis6380.config, redis6381.config, redis6382.config, redis6383.config, redis6384.config. Ubah nomor port di file konfigurasi agar sesuai dengan nomor port file.
daemonize yes
dir /usr/local/redis-7.2.4/redis-cluster/6382/
bind 192.168.47.100
port 6382
dbfilename dump6382.rdb
cluster-enabled yes
cluster-config-file nodes-6382.conf
cluster-node-timeout 5000
appendonly yes
protected-mode no
parameter:
- cluster-config-file: File konfigurasi persistensi cluster, yang berisi status node lain, variabel persistensi, dll., akan secara otomatis dibuat di direktori direktori yang dikonfigurasi di atas. Setiap node akan menyimpan file konfigurasi cluster selama operasi; setiap kali informasi cluster berubah (seperti menambah atau menghapus node), semua node di cluster akan memperbarui informasi terbaru ke file konfigurasi; file konfigurasi untuk mendapatkan informasi cluster, dan Anda dapat dengan mudah bergabung kembali dengan cluster. File konfigurasi cluster dikelola oleh Redis dan tidak memerlukan modifikasi manual.
- clouster-enabled: mengaktifkan cluster
Membuat folder
mkdir -p /usr/local/redis-7.2.4/redis-cluster/6379/
mkdir -p /usr/local/redis-7.2.4/redis-cluster/6380/
mkdir -p /usr/local/redis-7.2.4/redis-cluster/6381/
mkdir -p /usr/local/redis-7.2.4/redis-cluster/6382/
mkdir -p /usr/local/redis-7.2.4/redis-cluster/6383/
mkdir -p /usr/local/redis-7.2.4/redis-cluster/6384/
Mulai enam node
[root@bogon src]# ./redis-server ../redis6379.config
[root@bogon src]# ./redis-server ../redis6380.config
[root@bogon src]# ./redis-server ../redis6381.config
[root@bogon src]# ./redis-server ../redis6382.config
[root@bogon src]# ./redis-server ../redis6383.config
[root@bogon src]# ./redis-server ../redis6384.config
Periksa apakah setiap node berhasil dimulai
[root@bogon src]# ps -ef | grep redis
root 3889 1 0 09:56 ? 00:00:03 ./redis-server 0.0.0.0:6379 [cluster]
root 3895 1 0 09:56 ? 00:00:03 ./redis-server 0.0.0.0:6380 [cluster]
root 3901 1 0 09:57 ? 00:00:03 ./redis-server 0.0.0.0:6381 [cluster]
root 3907 1 0 09:57 ? 00:00:02 ./redis-server *:6382 [cluster]
root 3913 1 0 09:57 ? 00:00:02 ./redis-server 0.0.0.0:6383 [cluster]
root 3919 1 0 09:57 ? 00:00:02 ./redis-server 0.0.0.0:6384 [cluster]
root 4247 2418 0 10:22 pts/0 00:00:00 grep --color=auto redis
Konfigurasikan kluster
Format perintah: --cluster-replicas 1 berarti membuat node slave untuk setiap master
Melihat: IP di sini adalah IP sebenarnya dari mesin tempat setiap node berada.
[root@localhost src]# ./redis-cli --cluster create 192.168.47.100:6379 192.168.47.100:6380 192.168.47.100:6381 192.168.47.100:6382 192.168.47.100:6383 192.168.47.100:6384 --cluster-replicas 1
Verifikasi klaster
Hubungkan ke klien mana pun
./redis-cli -h 192.168.47.100 -p 6379 -c
parameter:
‐h : alamat host
-p : nomor port
-c: menunjukkan mode cluster
Tes penulisan data
[root@bogon src]# ./redis-cli -p 6379 -c
127.0.0.1:6379> set name zhangsan
-> Redirected to slot [5798] located at 192.168.47.100:6380
OK
192.168.47.100:6380> get name
"zhangsan"
192.168.47.100:6380>
[root@bogon src]# ./redis-cli -p 6383 -c
127.0.0.1:6383> get name
-> Redirected to slot [5798] located at 192.168.47.100:6380
"zhangsan"
192.168.47.100:6380>
[root@bogon src]# ./redis-cli -p 6383 -c
127.0.0.1:6383> readonly
OK
127.0.0.1:6383> get name
"zhangsan"
127.0.0.1:6383>
Gugus Redis Semua data dibagi menjadi 16384 slot (slot), dan setiap node bertanggung jawab atas bagian dari slot tersebut. Informasi slot disimpan di setiap node. Hanya node master yang akan diberi slot, dan node budak tidak akan diberi slot.
Algoritma penentuan posisi slot: nilai k1 = 127001
Secara default, Cluster akan menggunakan algoritma crc16 untuk melakukan hash pada nilai kunci untuk mendapatkan nilai integer, dan kemudian menggunakan nilai integer ini ke modulo 16384 untuk mendapatkan slot tertentu.
HASH_SLOT = CRC16(kunci) % 16384
Pemulihan
Lihat node
192.168.66.103:8001> cluster nodes
Bunuh simpul Master
lsof -i:8001
kill -9 pid
Amati informasi simpul
Ubah file konfigurasi
spring.data.redis.cluster.nodes=192.168.47.100:6381,192.168.47.100:6383,192.168.47.100:6380
Melihat
1. Klaster Redis memerlukan setidaknya 3 node untuk memastikan ketersediaan tinggi.
2. Anda harus mencoba untuk menghindari penambahan atau penghapusan node saat klaster Redis berjalan, karena hal ini dapat menyebabkan migrasi data dan dengan demikian mempengaruhi kinerja klaster Redis secara keseluruhan.
Kode ditulis dalam Java
@SpringBootTest
public class CluseterTest {
@Autowired
private RedisTemplate<String,Object> redisTemplate;
@Test
void string() {
// 保存字符串
redisTemplate.opsForValue().set("itbaizhan","itbaizhan123");
System.out.println(redisTemplate.opsForValue().get("itbaizhan"));
}
}
Jika konten saya bermanfaat bagi Anda, silakanSuka, komentar, favorit .Berkarya itu tidak mudah, dukungan semua oranglah yang membuat saya terus maju