日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

mysql主主keepalived_MySQL主主复制以及使用keepalived保证高可用

發布時間:2025/3/21 数据库 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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保证高可用的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。