1, Master slave replication concept
Master slave replication refers to copying data from one Redis server to other Redis servers. The former is called the master node
(master/leader), which is called slave / follower; Data replication is unidirectional and can only be from master node to slave node.
Master mainly writes, Slave mainly reads.
By default, each Redis server is the master node; A master node can have multiple slave nodes (or no slave nodes), but a slave node can only have one master node.
2, Role of master-slave replication:
1. Data redundancy: master-slave replication realizes the hot backup of data, which is a data redundancy method other than persistence.
2. Fault recovery: when the master node has problems, the slave node can provide services to achieve rapid fault recovery; It's actually a service
Redundancy.
3. Load balancing: on the basis of master-slave replication, combined with read-write separation, the master node can provide write services and the slave node can provide read services
(that is, the application connects the master node when writing Redis data and the slave node when reading Redis data) to share the server load, especially when writing
In the scenario of less reading and more reading, multiple slave nodes share the reading load, which can greatly improve the concurrency of Redis server.
4. High availability (cluster) cornerstone: in addition to the above functions, master-slave replication is also the basis for sentinel and cluster implementation. Therefore, master-slave replication
System is the basis of Redis high availability.
3, Modify master-slave replication configuration file and start Redis service
[root@VM-4-10-centos redis-6.2.4]# ls 00-RELEASENOTES deps redis-6379.conf runtest sentinel_26379.log sentinel-26382.conf src BUGS INSTALL redis-6380.conf runtest-cluster sentinel-26380.conf sentinel_26382.log tests CONDUCT Makefile redis-6381.conf runtest-moduleapi sentinel_26380.log sentinel-26383.conf TLS.md CONTRIBUTING MANIFESTO redis-6382.conf runtest-sentinel sentinel-26381.conf sentinel_26383.log COPYING README.md redis-6383.conf sentinel-26379.conf sentinel_26381.log sentinel.conf
Configure multiple redis Conf is used to start multiple redis services. It is easier to distinguish by adding end slogans. Five configuration files are configured: redis-6379 conf,redis-6380.conf,redis-6381.conf,redis-6382.conf,redis-6383.conf.
Port 6379 is the master node, and the rest are slave nodes.
By default, each Redis server is the master node; Generally, only the slave is configured. Configure in the configuration file of each slave node:
daemonize yes #Indicates background startup port 6379 #Change to your own port number slaveof 127.0.0.1 6379 #Master node IP address: the port number of the master node indicates that it is the slave node of the node
After the configuration file is configured, the redis service is started
Use the command:/ redis-server …/redis-6379.conf to start a redis service
[root@VM-4-10-centos src]# ./redis-server ../redis-6379.conf [root@VM-4-10-centos src]# ps -ef|grep redis root 3298 1 0 14:28 ? 00:00:29 ./redis-server 127.0.0.1:6379 root 3323 1 0 14:28 ? 00:00:26 ./redis-server 127.0.0.1:6380 root 3340 1 0 14:28 ? 00:00:25 ./redis-server 127.0.0.1:6381 root 3353 1 0 14:28 ? 00:00:26 ./redis-server 127.0.0.1:6382 root 3365 1 0 14:28 ? 00:00:26 ./redis-server 127.0.0.1:6383
[root@VM-4-10-centos src]# ./redis-cli -p 6379 #Start the client of the master node 127.0.0.1:6379> info replication # Replication role:master #Indicates that the node is the primary node connected_slaves:4 #Indicates that the node has 4 slave nodes slave0:ip=127.0.0.1,port=6380,state=online,offset=1809829,lag=0 #Information from the node slave1:ip=127.0.0.1,port=6381,state=online,offset=1809829,lag=0 slave2:ip=127.0.0.1,port=6382,state=online,offset=1809829,lag=0 slave3:ip=127.0.0.1,port=6383,state=online,offset=1809829,lag=0 master_failover_state:no-failover master_replid:415619cc6e479b710c68b353d1ebbad28d368ea1 master_replid2:0000000000000000000000000000000000000000 master_repl_offset:1809962 second_repl_offset:-1 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:761387 repl_backlog_histlen:1048576 127.0.0.1:6379>
[root@VM-4-10-centos src]# ./redis-cli -p 6380 #Start the client of the slave node with port number 6380 127.0.0.1:6380> info replication # Replication role:slave master_host:127.0.0.1 master_port:6379 master_link_status:up master_last_io_seconds_ago:0 master_sync_in_progress:0 slave_repl_offset:1824900 slave_priority:100 slave_read_only:1 replica_announced:1 connected_slaves:0 master_failover_state:no-failover master_replid:415619cc6e479b710c68b353d1ebbad28d368ea1 master_replid2:0000000000000000000000000000000000000000 master_repl_offset:1824900 second_repl_offset:-1 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:776325 repl_backlog_histlen:1048576 127.0.0.1:6380>
127.0.0.1:6379> set key "value" #Set a key value pair in the master node and try to get it from the slave node OK 127.0.0.1:6379>
[root@VM-4-10-centos src]# ./redis-cli -p 6380 #Start the client of the slave node with port number 6380 127.0.0.1:6380> get key #Successfully fetched from the node "value" 127.0.0.1:6380> set key2 "value2" #Try to write to the slave node and the prompt is read-only. (error) READONLY You can't write against a read only replica. 127.0.0.1:6380>
The method of master-slave switching technology is: when the master server is down, a slave server needs to be manually switched to the master server, which requires manual intervention, which is laborious and laborious, and the service will not be available for a period of time. This is not a recommended way. More often, we give priority to sentinel mode.
4, Sentinel mode concept
Sentinel mode is a special mode. Firstly, Redis provides sentinel commands. Sentinel is an independent process. As a process, it will run independently. The principle is that the * * * sentinel monitors multiple running Redis instances by sending commands and waiting for a response from the Redis server***
[root@VM-4-10-centos redis-6.2.4]# ./src/redis-sentinel ./sentinel-26379.conf #Start the sentry [root@VM-4-10-centos redis-6.2.4]# ps -ef|grep redis root 3298 1 0 14:28 ? 00:00:33 ./redis-server 127.0.0.1:6379 root 3323 1 0 14:28 ? 00:00:30 ./redis-server 127.0.0.1:6380 root 3340 1 0 14:28 ? 00:00:28 ./redis-server 127.0.0.1:6381 root 3353 1 0 14:28 ? 00:00:30 ./redis-server 127.0.0.1:6382 root 3365 1 0 14:28 ? 00:00:30 ./redis-server 127.0.0.1:6383 root 9050 1 0 15:03 ? 00:00:55 ./src/redis-sentinel *:26379 [sentinel] root 12160 1 0 15:23 ? 00:00:42 ./src/redis-sentinel *:26380 [sentinel] root 12196 1 0 15:24 ? 00:00:42 ./src/redis-sentinel *:26382 [sentinel] root 12213 1 0 15:24 ? 00:00:41 ./src/redis-sentinel *:26383 [sentinel] root 14032 9428 0 22:35 pts/0 00:00:00 ./redis-cli -p 6379 root 14626 9484 0 22:39 pts/1 00:00:00 ./redis-cli -p 6380 root 24367 23851 0 23:42 pts/2 00:00:00 grep --color=auto redis [root@VM-4-10-centos redis-6.2.4]#
Other configuration items for sentinel mode
Configuration item | Parameter type | effect |
---|---|---|
port | integer | Start sentinel process port |
dir | Folder directory | The sentinel process service temporary folder is / tmp by default. You should ensure that you have writable permissions |
sentinel down-after-milliseconds | < service name > < milliseconds (integer) > | When the designated Sentry is monitoring the Redis service, when the Redis service cannot answer within a default millisecond, the subjective offline time considered by a single Sentry is 30000 (30 seconds) by default |
sentinel parallel-syncs | < service name > < number of servers (integer) > | Specify how many Redis services can synchronize new hosts. Generally speaking, the smaller the number, the longer the synchronization time, and the larger the number, the higher the requirements for network resources |
sentinel failover-timeout | < service name > < milliseconds (integer) > | Specifies the number of milliseconds allowed for failover. If it exceeds this time, the failover is considered to have failed. The default is 3 minutes |
sentinel notification-script | < service name > < script path > | Specifies the alarm script to be called when sentinel detects the instance exception pointed to by the redis instance of the monitoring. This configuration item is optional and commonly used |
The sentinel down after milliseconds configuration item is just a sentinel. If the sentinel still fails to respond after the specified time, it will think that the host is unavailable. For other sentinels, this is not the case. The sentinel will record this message. When the number of sentinels who think they are offline reaches the configured number of sentinel monitor, a vote will be initiated to fail. At this time, the sentinel will rewrite the sentinel configuration file of Redis to meet the needs of the new scene.
Modify redis The conf file is as follows:
# The Redis server can be accessed across the network bind 0.0.0.0 # Set password requirepass "123456" # Specify the master server. Note: slaveof configuration only configures the slave server, and the master server does not need to be configured slaveof 192.168.11.128 6379 # Master server password. Note: slaveof configuration only configures the slave server, and the master server does not need to be configured masterauth 123456
The above content is mainly to configure the Redis server. The slave server has one more slave configuration and password than the master server.
Configure 3 sentinels, and the configuration of each sentinel is the same. There is a sentinel in the Redis installation directory Conf file, copy a copy to modify
# Disable protection mode protected-mode no # Configure the master server for listening. sentinel monitor stands for monitoring and mymaster stands for the name of the server. It can be customized. 192.168 11.128 represents the monitored master server, 6379 represents the port, and 2 represents the failover operation only when two or more sentinels think the master server is unavailable. sentinel monitor mymaster 192.168.11.128 6379 2 # Sentinel author pass defines the password of the service. mymaster is the service name and 123456 is the Redis server password # sentinel auth-pass <master-name> <password> sentinel auth-pass mymaster 123456
Redis cache penetration, cache breakdown, cache avalanche cause + Solution
-
Cache penetration: the data corresponding to the key does not exist in the data source. Every time a request for this key cannot be obtained from the cache, the request will be sent to the data source, which may crush the data source. For example, using a nonexistent user id to obtain user information, no matter in the cache or the database, if hackers use this vulnerability to attack, it may crush the database.
solve:
There must be no cache and data that cannot be queried. Because the cache is written passively when it misses, and for the sake of fault tolerance, if the data cannot be found from the storage layer, it will not be written to the cache, which will cause the nonexistent data to be queried at the storage layer every request, losing the significance of the cache.
There are many methods to effectively solve the cache penetration problem. The most common is to use bloom filter to hash all possible data into a large enough bitmap, and a non-existent data will be intercepted by the bitmap, so as to avoid the query pressure on the underlying storage system. In addition, there is a more simple and crude method (we use this method). If the data returned by a query is empty (whether the data does not exist or the system fails), we still cache the empty result, but its expiration time will be very short, no more than five minutes.
-
Cache breakdown: the data corresponding to the key exists, but it expires in redis. At this time, if a large number of concurrent requests come, if these requests find that the cache expires, they will generally load data from the back-end dB and set it back to the cache. At this time, large concurrent requests may crush the back-end DB instantly.
solve:
key may be accessed at some point in time with extremely high concurrency, which is a very "hot" data. At this time, we need to consider a problem: the cache is "broken down".
Use mutex key
A common practice in the industry is to use mutex. In short, When the cache fails (it is judged that the value is empty), instead of immediately loading dB, set a mutex key by using some operations of the cache tool with the return value of successful operations (such as SETNX of Redis or ADD of Memcache). When the operation returns success, load db and reset the cache; otherwise, retry the whole get cache method.
public String get(key) { String value = redis.get(key); if (value == null) { //Represents that the cache value has expired //Set a 3min timeout to prevent the next cache expiration from failing to load db when the del operation fails if (redis.setnx(key_mutex, 1, 3 * 60) == 1) { //Representative setting succeeded value = db.get(key); redis.set(key, value, expire_secs); redis.del(key_mutex); } else { //At this time, it means that other threads at the same time have loaded dB and set it back to the cache. At this time, you can retry to obtain the cache value sleep(50); get(key); //retry } } else { return value; } }
-
Cache avalanche: when the cache server restarts or a large number of caches fail in a certain period of time, it will also bring great pressure to the back-end system (such as DB).
solve:
The avalanche effect of cache failure has a terrible impact on the underlying system! Most system designers consider locking or queuing to ensure that a large number of threads will not read and write to the database at one time, so as to avoid a large number of concurrent requests falling on the underlying storage system in case of failure. There is also a simple scheme to spread the cache expiration time. For example, we can add a random value based on the original expiration time, such as 1-5 minutes random, so that the repetition rate of each cache expiration time will be reduced, and it is difficult to cause collective failure events.
Normal:
Avalanche: