ip地址如下:
192.168.20.201 redis01 主 192.168.20.202 redis02 主 192.168.20.203 redis03 从 192.168.20.205 vip
修改my.cnf配置文件如下
[root@redis01 keepalived]# cat /etc/my.cnf [mysqld] server-id=1 log-bin=mysql-bin gtid_mode = ON enforce_gtid_consistency = ON master_info_repository =TABLE relay_log_info_repository=TABLE binlog_checksum=NONE log_slave_updates=ON binlog_format=ROW log_timestamps= SYSTEM #Group Replication Settings plugin-load = "rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so" rpl-semi-sync-master-enabled = 1 rpl-semi-sync-slave-enabled = 1 slave_parallel_type=database slave_parallel_workers=3 #GENERAL datadir=/data/mysql socket=/data/mysql/mysql.sock pid-file=/data/mysqld.pid user=mysql port=3306 default_storage_engine=InnoDB #INNODB innodb_buffer_pool_size = 512M innodb_log_file_size=10M innodb_file_per_table=1 innodb_flush_method=O_DIRECT #MYISAM key_buffer_size=10M #LOGGING log-error=/data/log/mysql-error.log slow_query_log=1 #是否启用慢查询日志,1为启用,0为禁用 slow_query_log_file=/data/log/mysql-slow.log #指定慢查询日志文件的路径和名字,可使用绝对路径指定;默认值是'主机名_slow.log',位于datad #OTHER tmp_table_size=32M max_heap_table_size=32M #query_cache_type=0 #query_cache_size=0 max_connections=1000 thread_cache_size=100 #table_cache=100 open_files_limit=65535 [client] #socket=/var/lib/mysql/mysql.sock socket=/data/mysql/mysql.sock port=3306 user=root password=ocm123 其他节点修改server-id的值
创建复制用户及授权,3个节点都需要创建
create user 'repl'@'192.%' identified by 'ocm123'; GRANT replication slave ON *.* to repl@'192.%' IDENTIFIED BY 'ocm123';
安装及配置keepalived
yum install keepalived-1*
先备份配置文件
cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf_bak
修改配置文件如下,修改前保证防火墙已关掉,或者在/etc/sysconfig/iptables加入以下条目
-A INPUT -d 192.168.20.205 -j ACCEPT
配置keepalived为backup模式,master挂掉以后,vip切换到backup(redis02)主机,当master(redis01)主机启动以后不会抢回vip,从机redis03不会在切换一次
主机redis01
[root@redis01 keepalived]# cat keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id MYSQL-HA
}
vrrp_script chk_mysql_port {
script "/etc/keepalived/check.sh"
interval 2
fall 2
rise 1
}
vrrp_instance VI_1 {
state BACKUP
priority 150
nopreempt
interface eth1
virtual_router_id 51
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.20.205
}
track_script {
chk_mysql_port
}
}
主机redis02
[root@redis02 keepalived]# cat keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id MYSQL-HA
}
vrrp_script chk_mysql_port {
script "/etc/keepalived/check.sh"
interval 2
fall 2
rise 1
}
vrrp_instance VI_1 {
state BACKUP
priority 50
nopreempt
interface eth5
virtual_router_id 51
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.20.205
}
track_script {
chk_mysql_port
}
}
mysql监控脚本如下
[root@redis02 keepalived]# cat check.sh
#!/bin/bash
counter=$(netstat -na|grep "LISTEN"|grep "3306"|wc -l)
if [ "${counter}" -eq 0 ]; then
/etc/init.d/keepalived stop
fi
配置复制
change master to master_host='redis01', master_user='repl', master_password='ocm123', master_auto_position=150; change master to master_host='redis02', master_user='repl', master_password='ocm123', master_auto_position=150; change master to master_host='192.168.20.205', master_user='repl', master_password='ocm123', master_auto_position=150;
验证vip切换
查看ip
[root@redis01 sysconfig]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 08:00:27:2b:cf:c4 brd ff:ff:ff:ff:ff:ff
inet 10.0.2.15/24 brd 10.0.2.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::a00:27ff:fe2b:cfc4/64 scope link
valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 08:00:27:ad:69:96 brd ff:ff:ff:ff:ff:ff
inet 192.168.20.201/24 brd 192.168.20.255 scope global eth1
valid_lft forever preferred_lft forever
inet 192.168.20.205/32 scope global eth1
valid_lft forever preferred_lft forever
inet6 fe80::a00:27ff:fead:6996/64 scope link
valid_lft forever preferred_lft forever
在redis03上查看vip在那个主机上
[root@redis03 ~]# ssh 192.168.20.205 hostname
redis01
关掉redis01上mysql
[root@redis01 sysconfig]# /etc/init.d/mysqld stop
Stopping mysqld: [ OK ]
[root@redis01 sysconfig]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 08:00:27:2b:cf:c4 brd ff:ff:ff:ff:ff:ff
inet 10.0.2.15/24 brd 10.0.2.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::a00:27ff:fe2b:cfc4/64 scope link
valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 08:00:27:ad:69:96 brd ff:ff:ff:ff:ff:ff
inet 192.168.20.201/24 brd 192.168.20.255 scope global eth1
valid_lft forever preferred_lft forever
inet6 fe80::a00:27ff:fead:6996/64 scope link
valid_lft forever preferred_lft forever
[root@redis03 ~]# ssh 192.168.20.205 hostname
redis02
结论 redis01上mysql会自动关闭keepalived,vip切换到redis02上
启动redis01上mysql及keepalived看vip是否会切回redis01
[root@redis01 sysconfig]# /etc/init.d/mysqld start
Starting mysqld: [ OK ]
[root@redis01 sysconfig]# /etc/init.d/keepalived start
Starting keepalived: [ OK ]
[root@redis01 sysconfig]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 08:00:27:2b:cf:c4 brd ff:ff:ff:ff:ff:ff
inet 10.0.2.15/24 brd 10.0.2.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::a00:27ff:fe2b:cfc4/64 scope link
valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 08:00:27:ad:69:96 brd ff:ff:ff:ff:ff:ff
inet 192.168.20.201/24 brd 192.168.20.255 scope global eth1
valid_lft forever preferred_lft forever
inet6 fe80::a00:27ff:fead:6996/64 scope link
valid_lft forever preferred_lft forever
[root@redis03 ~]# ssh 192.168.20.205 hostname
redis02
从上面得出结论,redis01启动mysql以后不会抢回vip
查看从机redis03上复制状态
mysql> show slave status G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.20.205
Master_User: repl
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000005
Read_Master_Log_Pos: 230
Relay_Log_File: redis03-relay-bin.000074
Relay_Log_Pos: 435
Relay_Master_Log_File: mysql-bin.000005
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 230
Relay_Log_Space: 921
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 2
Master_UUID: e1ce6245-b4a3-11e8-9ecc-08002771e31b
Master_Info_File: mysql.slave_master_info
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
Master_Retry_Count: 86400
Master_Bind:
Last_IO_Error_Timestamp:
Last_SQL_Error_Timestamp:
Master_SSL_Crl:
Master_SSL_Crlpath:
Retrieved_Gtid_Set: be2030ff-b4a3-11e8-8764-0800272bcfc4:1-54,
e1ce6245-b4a3-11e8-9ecc-08002771e31b:1
Executed_Gtid_Set: be2030ff-b4a3-11e8-8764-0800272bcfc4:1-54,
e1ce6245-b4a3-11e8-9ecc-08002771e31b:1
Auto_Position: 1
Replicate_Rewrite_DB:
Channel_Name:
Master_TLS_Version:
1 row in set (0.00 sec)
mysql> select * from mysql.slave_master_info G
*************************** 1. row ***************************
Number_of_lines: 25
Master_log_name: mysql-bin.000005
Master_log_pos: 230
Host: 192.168.20.205
User_name: repl
User_password: ocm123
Port: 3306
Connect_retry: 60
Enabled_ssl: 0
Ssl_ca:
Ssl_capath:
Ssl_cert:
Ssl_cipher:
Ssl_key:
Ssl_verify_server_cert: 0
Heartbeat: 30
Bind:
Ignored_server_ids: 0
Uuid: e1ce6245-b4a3-11e8-9ecc-08002771e31b
Retry_count: 86400
Ssl_crl:
Ssl_crlpath:
Enabled_auto_position: 1
Channel_name:
Tls_version:
1 row in set (0.00 sec)
mysql> select * from mysql.slave_relay_log_infoG
*************************** 1. row ***************************
Number_of_lines: 7
Relay_log_name: ./redis03-relay-bin.000073
Relay_log_pos: 435
Master_log_name: mysql-bin.000016
Master_log_pos: 230
Sql_delay: 0
Number_of_workers: 3
Id: 1
Channel_name:
1 row in set (0.00 sec)
mysql> select * from mysql.slave_worker_info G
*************************** 1. row ***************************
Id: 1
Relay_log_name: ./redis03-relay-bin.000005
Relay_log_pos: 730
Master_log_name: mysql-bin.000001
Master_log_pos: 1349594
Checkpoint_relay_log_name: ./redis03-relay-bin.000005
Checkpoint_relay_log_pos: 438
Checkpoint_master_log_name: mysql-bin.000001
Checkpoint_master_log_pos: 1349302
Checkpoint_seqno: 0
Checkpoint_group_size: 64
Checkpoint_group_bitmap:
Channel_name:
*************************** 2. row ***************************
Id: 2
Relay_log_name:
Relay_log_pos: 0
Master_log_name:
Master_log_pos: 0
Checkpoint_relay_log_name:
Checkpoint_relay_log_pos: 0
Checkpoint_master_log_name:
Checkpoint_master_log_pos: 0
Checkpoint_seqno: 0
Checkpoint_group_size: 64
Checkpoint_group_bitmap:
Channel_name:
*************************** 3. row ***************************
Id: 3
Relay_log_name: ./redis03-relay-bin.000002
Relay_log_pos: 910010
Master_log_name: mysql-bin.000001
Master_log_pos: 909805
Checkpoint_relay_log_name: ./redis03-relay-bin.000002
Checkpoint_relay_log_pos: 555275
Checkpoint_master_log_name: mysql-bin.000001
Checkpoint_master_log_pos: 555070
Checkpoint_seqno: 0
Checkpoint_group_size: 64
Checkpoint_group_bitmap:
Channel_name:
3 rows in set (0.00 sec)