mysql主主keepalived_MySQL主主复制以及使用keepalived保证高可用
1:準備工作
MySQL的安裝步驟在此處省略;安裝完成一定要做以下準備工作,初始化MySQL,/usr/bin/mysql_secure_installation,設置root密碼,刪除無效賬戶以及test庫,必須保持兩臺MySQL上的root密碼一致,因為我們這里的主主復制是要做高可用的,mysql庫涉及到賬戶和密碼以及權限,也會進行同步。
PS:這里如果是編譯安裝命令應該在/usr/local/mysql/bin/mysql_secure_installation下,yum安裝,MySQL啟動后密碼會生成在/var/log/mysqld.log文件中。
[root@node1 ~]# /usr/bin/mysql_secure_installation
New password:
Re-enter new password:
The 'validate_password' plugin is installed on the server.
The subsequent steps will run with the existing configuration
of the plugin.
#設置新密碼
Remove anonymous users? (Press y|Y for Yes, any other key for No) : y
#刪除匿名用戶
Disallow root login remotely? (Press y|Y for Yes, any other key for No) :
#拒絕root賬戶遠程登錄
Remove test database and access to it? (Press y|Y for Yes, any other key for No) :
刪除test數據庫
Reload privilege tables now? (Press y|Y for Yes, any other key for No) : Y
#重新加載權限
2:修改配置文件,建立主主復制
PS:注意以下配置中除了server_id不同以外,其他配置最好保持相同。硬件配置最好也要相同。
[mysqld]
#---------此處為MySQL優化參數配置----------
#修改最大連接數
max_connections = 500
#設置默認字符集為utf8
character-set-server=utf8
#查詢排序時緩沖區大小,只對order by和group by起作用,可增大此值為16M
sort_buffer_size = 16M
#查詢緩存限制,只有1M以下查詢結果才會被緩存,以免結果數據較大把緩存池覆蓋
query_cache_limit = 1M
#查看緩沖區大小,用于緩存SELECT查詢結果,下一次有同樣SELECT查詢將直接從緩存池返回結果,可適當成倍增加此值
query_cache_size = 16M
#給所有的查詢做cache,代表使用緩沖
query_cache_type = 1
#設置以順序掃描的方式掃描表數據的時候使用緩沖區的大小
read_buffer_size = 8M
#打開文件數限制
open_files_limit = 10240
#修改InnoDB為獨立表空間模式,每個數據庫的每個表都會生成一個數據空間
innodb_file_per_table = 1
#索引和數據緩沖區大小,一般設置物理內存的60%-70%
innodb_buffer_pool_size = 1G
#緩沖池實例個數,推薦設置4個或8個
innodb_buffer_pool_instances = 8
#2代表只把日志寫入到系統緩存區,再每秒同步到磁盤,效率很高
innodb_flush_log_at_trx_commit = 2
#日志緩沖區大小,由于日志最長每秒鐘刷新一次,所以一般不用超過16M
innodb_log_buffer_size = 8M
#back_log參數的值指出在MySQL暫時停止響應新請求之前的短時間內多少個請求可以被存在堆棧中
back_log = 1024
#thread cache 池中存放的最大連接數
thread_cache_size = 64
#開啟慢查詢日志
slow_query_log = ON
#-------此處為MySQL復制參數配置--------------
#datadir = /mfg/mysql/data/ #數據文件目錄,此處我采用的是默認配置
log-bin = master-bin #二進制日志,后面指定存放位置。如果只是指定名字,默認存放在/var/lib/mysql下
log-bin-index = master-bin.index #index文件名稱
innodb_file_per_table = 1 #可以修改InnoDB為獨立表空間模式,每個數據庫的每個表都會生成一個數據空間
relay-log = relay-log #中繼日志, 后面指定存放位置。如果只是指定名字,默認存放在/var/lib/mysql下
relay-log-index = relay-log.index #relay-log index文件的名稱
binlog_format = row # 二進制日志文件格式
gtid_mode = ON #開啟GITD
enforce-gtid-consistency = ON #強制GTID的一致性
master-info-repository=TABLE
relay-log-info-repository=TABLE #此兩項為打開從服務器崩潰二進制日志功能,信息記錄在事物表而不是保存在文件
sync-master-info = 1 #值為1確保信息不會丟失
slave_parallel_workers = 4 #設定從服務器的SQL線程數;0表示關閉多線程復制功能
binlog-checksum = CRC32 #效驗碼
master-verify-checksum = 1 # 啟動主服務器效驗
slave-sql-verify-checksum = 1 # 啟動從服務器效驗
binlog-rows-query-log_events = 1 #用于在二進制日志詳細記錄事件相關的信息,可降低故障排除的復雜度;
log-slave-updates=true #slave更新是否記入日志
server_id = 128 #此處兩臺的ID必須不能相同!
3:添加防火墻策略,允許vrrp協議和mysql端口。
vim /etc/sysconfig/iptables
-A INPUT -p tcp -m state --state NEW -m tcp --dport 3306 -j ACCEPT
-A INPUT -i ens160 -p vrrp -s 192.168.180.187 -j ACCEPT
#ens160代表的是網卡名稱,實驗環境關閉selinux和防火墻。
4:創建同步賬號,并授權。
#在master A上:
mysql> grant replication slave on *.* to 'sync'@'192.168.116.128' identified by 'synC123.';
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)
#在masterB 上:
mysql> grant replication slave on *.* to 'sync'@'192.168.116.129' identified by 'synC123.';
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)
5:建立主從關系
#在Master A 上:
mysql> change master to master_host='192.168.116.129', master_user='sync',master_password='synC123.', master_auto_position=1;
Query OK, 0 rows affected, 2 warnings (0.01 sec)
mysql> start slave;
Query OK, 0 rows affected (0.01 sec)
#在master B上:
mysql> change master to master_host='192.168.116.128', master_user='sync',master_password='synC123.', master_auto_position=1;
Query OK, 0 rows affected, 2 warnings (0.02 sec)
mysql> start slave;
Query OK, 0 rows affected (0.01 sec)
#此時在A和B上分別用
mysql> show slave status\G;來驗證主從關系的建立是否正確。
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.116.129
Master_User: sync
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: master-bin.000001
Read_Master_Log_Pos: 1052
Relay_Log_File: relay-log.000002
Relay_Log_Pos: 914
Relay_Master_Log_File: master-bin.000001
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: 1052
Relay_Log_Space: 1115
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: 129
Master_UUID: 683b5a5f-75bb-11e7-bc1a-000c29120a74
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: 683b5a5f-75bb-11e7-bc1a-000c29120a74:1-2
Executed_Gtid_Set: 051563bb-75bb-11e7-b997-000c29b156e5:1-2,
683b5a5f-75bb-11e7-bc1a-000c29120a74:1-2
Auto_Position: 1
Replicate_Rewrite_DB:
Channel_Name:
Master_TLS_Version:
1 row in set (0.00 sec)
6:定義MySQL檢測腳本,主從都需要定義。
[root@node1 ~]# vim /root/keepalived_check_mysql.sh
#!/bin/bash
MYSQL=/usr/local/mysql/bin/mysql
MYSQL_HOST=localhost
MYSQL_USER=root
MYSQL_PASSWORD=123456
CHECK_TIME=4
#mysql is working MYSQL_OK is 1 , mysql down MYSQL_OK is 0
MYSQL_OK=1
function check_mysql_helth (){
$MYSQL -h $MYSQL_HOST -u $MYSQL_USER -p${MYSQL_PASSWORD} -e "show status;" >/dev/null 2>&1
if [ $? = 0 ] ;then
MYSQL_OK=1
else
MYSQL_OK=0
fi
return $MYSQL_OK
}
while [ $CHECK_TIME -ne 0 ]
do
let "CHECK_TIME -= 1"
check_mysql_helth
if [ $MYSQL_OK = 1 ] ; then
CHECK_TIME=0
exit 0
fi
if [ $MYSQL_OK -eq 0 ] && [ $CHECK_TIME -eq 0 ]
then
systemctl stop keepalived.service
exit 1
fi
sleep 1
done
#賦予執行權限
[root@node1 ~]# chmod +x /root/keepalived_check_mysql.sh
7:安裝keepalived,并修改配置文件。
PS:這里設置的是非搶占模式,因為MySQL主主復制,互為備份,當一臺down掉以后,vip漂移到另外一臺,此時數據將會寫入另外一臺服務器,而當我將down掉的服務器恢復以后,他必須要向當前正在工作的master復制數據,如果此時搶占為主,可能數據還沒有同步完成,而此時寫入數據必然會造成數據不一致錯誤。如果在這個時候再進行恢復,是相當困難的。
#安裝:
yum install keepalived
#修改配置文件,
vim /etc/keepalived/keepalived.conf
#配置文件如下:
! Configuration File for keepalived
global_defs {
smtp_connect_timeout 3
smtp_server 127.0.0.1
router_id mysqlnode1
}
vrrp_script check_run {
script "/root/keepalived_check_mysql.sh"
interval 3
}
vrrp_sync_group VM1 {
group {
VM_1
}
}
vrrp_instance VM_1 {
state BACKUP
nopreempt
interface ens33
virtual_router_id 180
priority 99
advert_int 1
authentication {
auth_type PASS
auth_pass 123456
}
track_script {
check_run
}
virtual_ipaddress {
192.168.116.130
}
}
PS:這里面router_id 和 priority 99必須不一致,主的權重應該大于從的, router_id可以自己定義。此時設置為不搶占,兩臺服務器的state 必須設置為BACKUP。
#啟動keepalived先啟動Master再啟動slave。
systemctl start keepalived
#加入到開機啟動項
systemctl enable keepalived
#此時可以使用ip add sh 查看虛擬IP是否在master上,然后通過停止MySQL以及keepalived和關機,來驗證兩臺服務器的高可用性,此時前端所有的連接都需要執行VIP。
8:mysql 刪除主從信息
1:stop slave;
2:reset slave;
3:change master to master_host=' ';
同理后面的選項在兩個單引號之間也需要空格,來刪除主從信息!
9:以前版本的安裝腳本和文檔
1:更改mysql配置文件
[mysqld]
datadir = /mfg/mysql/data/ #數據文件目錄
log-bin = master-bin #二進制日志,后面指定存放位置。如果只是指定名字,默認存放在/var/lib/mysql下
log-bin-index = master-bin.index #index文件名稱
innodb_file_per_table = 1 #可以修改InnoDB為獨立表空間模式,每個數據庫的每個表都會生成一個數據空間
relay-log = relay-log #中繼日志, 后面指定存放位置。如果只是指定名字,默認存放在/var/lib/mysql下
relay-log-index = relay-log.index #relay-log index文件的名稱
binlog_format = row # 二進制日志文件格式
gtid_mode = ON #開啟GITD
enforce-gtid-consistency = ON #強制GTID的一致性
master-info-repository=TABLE
relay-log-info-repository=TABLE #此兩項為打開從服務器崩潰二進制日志功能,信息記錄在事物表而不是保存在文件
sync-master-info = 1 #值為1確保信息不會丟失
slave_parallel_workers = 4 #設定從服務器的SQL線程數;0表示關閉多線程復制功能
binlog-checksum = CRC32 #效驗碼
master-verify-checksum = 1 # 啟動主服務器效驗
slave-sql-verify-checksum = 1 # 啟動從服務器效驗
binlog-rows-query-log_events = 1 #用于在二進制日志詳細記錄事件相關的信息,可降低故障排除的復雜度;
log-slave-updates=true #slave更新是否記入日志
server_id = 86 #此處兩臺的ID必須不能相同!
2:添加防火墻策略,允許vrrp協議和mysql端口。
vi /etc/sysconfig/iptables
-A INPUT -p tcp -m state --state NEW -m tcp --dport 3306 -j ACCEPT
-A INPUT -i ens160 -p vrrp -s 192.168.180.187 -j ACCEPT
3:添加權限
3.1 :grant replication slave on *.* to 'sync'@'192.168.180.186' identified by 'sync';
grant replication slave on *.* to 'sync'@'192.168.180.187' identified by 'sync';
change master to master_host='192.168.180.187',master_user='sync',master_password='sync',master_log_file='master-bin.000001',master_log_pos=411;
change master to master_host='192.168.1.20', master_user='repluser',master_password='replpass', master_auto_position=1;(GTID用此條命令即可)
change master to master_host='192.168.180.186',master_user='sync',master_password='sync',master_log_file='master-bin.000001',master_log_pos=411;
分別開啟:start slave;
show slave \G;
注釋:log_file和log_pos通過show master status\G查看。
4:安裝keepalived,寫mysql檢查腳本
mysql 檢測腳本 vi /root/keepalived_check_mysql.sh
#!/bin/bash
MYSQL=/usr/local/mysql/bin/mysql
MYSQL_HOST=localhost
MYSQL_USER=root
MYSQL_PASSWORD=123456
CHECK_TIME=4
#mysql is working MYSQL_OK is 1 , mysql down MYSQL_OK is 0
MYSQL_OK=1
function check_mysql_helth (){
$MYSQL -h $MYSQL_HOST -u $MYSQL_USER -p${MYSQL_PASSWORD} -e "show status;" >/dev/null 2>&1
if [ $? = 0 ] ;then
MYSQL_OK=1
else
MYSQL_OK=0
fi
return $MYSQL_OK
}
while [ $CHECK_TIME -ne 0 ]
do
let "CHECK_TIME -= 1"
check_mysql_helth
if [ $MYSQL_OK = 1 ] ; then
CHECK_TIME=0
exit 0
fi
if [ $MYSQL_OK -eq 0 ] && [ $CHECK_TIME -eq 0 ]
then
systemctl stop keepalived.service
exit 1
fi
sleep 1
done
yum -y install keepalived
5:修改keepalived配置文件
vi /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
smtp_connect_timeout 3
smtp_server 127.0.0.1
router_id dhsmysql(主從不一樣)
}
vrrp_script check_run {
script "/root/keepalived_check_mysql.sh"
interval 3
}
vrrp_sync_group VM1 {
group {
VM_1
}
}
vrrp_instance VM_1 {
state MASTER
interface ens160(網絡接口名稱)
virtual_router_id 180(虛擬ID必須一樣)
priority 99(主的權重一定要大于從)
advert_int 1
authentication {
auth_type PASS
auth_pass mfg@123
}
track_script {
check_run
}
virtual_ipaddress {
192.168.180.185
}
}
總結
以上是生活随笔為你收集整理的mysql主主keepalived_MySQL主主复制以及使用keepalived保证高可用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql 立方根函数_PostgreS
- 下一篇: pdo mysql fetchall_p