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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

mysql keepalived双主双活_mysql高可用架构方案之中的一个(keepalived+主主双活)

發(fā)布時間:2023/12/2 数据库 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mysql keepalived双主双活_mysql高可用架构方案之中的一个(keepalived+主主双活) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

Mysql雙主雙活+keepalived實現(xiàn)高可用

文件夾

1、前言... 4

2、方案... 4

2.1、環(huán)境及軟件... 4

2.2、IP規(guī)劃... 4

2.3、架構(gòu)圖... 4

3、安裝設(shè)置MYSQL半同步... 5

4、Keepalived實現(xiàn)MYSQL的高可用... 11

1、前言

近期研究了下高可用的東西,這里總結(jié)一下mysql主主雙活的架構(gòu)方案,總體上提高服務(wù)的高可用性。出現(xiàn)故障也不須要手動切換。提高總體的維護(hù)效率。

確定改造的話,僅僅須要讓他們的程序中使用vip地址就能夠,實現(xiàn)起來比較easy。

2、方案

本案例先使用兩臺linux做雙機(jī)MASTER-MASTER高可用(興許能夠考慮增加僅僅讀SLAVER,用于提高查詢性能),採用MYSQL5.6.x的半同步實現(xiàn)數(shù)據(jù)復(fù)制和同步。使用keepalived來監(jiān)控MYSQL和提供VIP及浮動。不論什么一臺主機(jī)宕機(jī)都不會影響對外提供服務(wù)(vip能夠浮動),保持服務(wù)的高可用。

注 keepalived之間使用vrrp組播方式通信使用的IP地址是192.168.150.201

2.1、環(huán)境及軟件

操作系統(tǒng):RedHat 5.5

Keepalived:keepalived-1.2.12.tar.gz

MYSQL:MySQL-server- mysql-5.0.77-4.el5_4.2.x86_64.rpm?? MySQL-client- mysql-5.0.77-4.el5_4.2.x86_64.rpm

2.2、IP規(guī)劃

名稱

IP

備注

VIP

192.168.150.201

由KEEPALIVED產(chǎn)生的虛擬IP,也是前端client使用的IP

MYSQL_DB_MASTER1

192.168.150.145

數(shù)據(jù)庫1server

MYSQL_DB_MASTER2

192.168.150.146

數(shù)據(jù)庫2server

2.3、架構(gòu)圖

3、安裝設(shè)置MYSQL半同步

3.1、安裝MYSQL

這里選擇的是使用社區(qū)版的MYSQL,請在www.mysql.com上下載相應(yīng)操作系統(tǒng)的安裝文件,這里依據(jù)官方的建議使用RPM包方式安裝。也能夠進(jìn)行yum安裝。

安裝

假設(shè)是默認(rèn)Redhat5.5安裝后,

# 使用yum 安裝 yum install mysql

yum install mysql-server

……

默認(rèn)安裝是在/usr以下。所以my.cnf是在/usr/my.cnf,這里為了習(xí)慣使用方法,復(fù)制到/etc/文件夾下

# mv /usr/my.cnf /etc/

標(biāo)準(zhǔn)方式改動password

# mysqladmin -u root -p oldPassword password

# New password:

# Confirm new password:

# mysqladmin -u root -p password newPassword

SQL直接更新方式改動password:

初始化rootpassword常見問題及處理

error: 'Access denied for user 'root'@'localhost' (usingpassword: NO)'

# /etc/init.d/mysql stop

# mysqld_safe --user=mysql --skip-grant-tables--skip-networking &

# mysql -u root mysql

mysql> UPDATE user SETPassword=PASSWORD('newpassword') where USER='root';

mysql> FLUSH PRIVILEGES;

mysql> quit

# /etc/init.d/mysql restart

# mysql -uroot -p

Enter password:

mysql>

設(shè)置網(wǎng)絡(luò)訪問權(quán)限

MYSQL的用戶訪問策略是須要指定用戶從某IP能夠訪問那些權(quán)限。

詳細(xì)使用方法請參考grant命令。這里為了簡單起見,直接設(shè)置root用戶在整個局域內(nèi)(192.168.150.*)都能夠訪問數(shù)據(jù)庫。

# mysql -uroot -p

******

mysql> GRANT ALL PRIVILEGES ON *.* TO root@'192.168.150.%' IDENTIFIEDBY 'password' WITH GRANT OPTION;

mysql>FLUSH PRIVILEGES;

這樣設(shè)置后,就能夠通過內(nèi)網(wǎng)的其它機(jī)器訪問數(shù)據(jù)庫了。

改動數(shù)據(jù)文件路徑

mysql安裝后。默認(rèn)的數(shù)據(jù)存儲路徑在/var/lib/mysql下。

這里改動為/data/mysql

# service mysql stop

# mkdir /data/mysql

# cp -r /var/lib/mysql/* /data/mysql

# chown -R mysql:mysql /data/mysql

vi /etc/my.cnf

改動里面的參數(shù)

[mysqld]

datadir= /data/mysql

socket= /data/mysql/mysql.sock

# 順便配置下MYSQL使用mysql用戶啟動

user=mysql

保存退出

為/data/mysql/mysql.sock建立指向/var/lib/mysql/mysql.sock的軟連接

# ln -s /data/mysql/mysql.sock /var/lib/mysql/mysql.sock

啟動MYSQL并測試

# service mysql start

# mysql -uroot -p

******

mysql>

最可能出現(xiàn)的問題(假設(shè)你是Redhat6.x或CentOS6.x):selinux 照成服務(wù)無法正常啟動,報錯:

Starting MySQL. ERROR! The server quit without updatingPID file (/data/mysql/xxxxx.pid).

驗證問題方法:

# setenforce 0

# service mysql start

Starting MySQL. SUCCESS!

假設(shè)能正常啟動,解決這個問題。就確定是selinux造成的問題了。

解決的方法:直接禁用

vim /etc/selinux/config

改動:SELINUX=disabled

保存后,重新啟動操作系統(tǒng)生效

如 果出現(xiàn)故障,一般解決這個問題的方式是查看MYSQL的日志文件,一般提示會比較清楚,或者依據(jù)錯誤信息區(qū)GOOGLE都能夠找到答案。日志文件:${datadir}/${hostname}.err, 本例中改動了數(shù)據(jù)文件夾。所以日志文件是:/data/mysql/acooly1.err

OK,本節(jié)安裝MYSQL完畢,然后另外一臺server的MYSQL安裝全然同樣(半同步的設(shè)置有小不同,那以下會說明)。請參照以上說明安裝另外一臺MYSQL服務(wù)(MYSQL_DB_MASTER2)。

3.2、設(shè)置MYSQL雙向半同步

本方案中為了實現(xiàn)故障轉(zhuǎn)移功能。在利用半同步復(fù)制能力的同一時候,對總體方案進(jìn)行了調(diào)整例如以下:

1.? MYSQL_DB_MASTER1 和MYSQL_DB_MASTER2互為主備。即MYSQL_DB_MASTER1時MYSQL_DB_MASTER2的 主。MYSQL_DB_MASTER2是MYSQL_DB_MASTER1的主,通過半同步實現(xiàn)雙向的同步復(fù)制(注意:這里不會出現(xiàn)沖突,由于備機(jī)僅僅會同步不是本機(jī)server_id的bin-log日志。通過兩臺機(jī)器的server_id隔離須要同步的bin-log)

2.? 通過Keepalived實現(xiàn)MYSQLserver的監(jiān)控和VIP的浮動,保證同一時間僅僅有一臺MYSQLserver可用。

3.? 該方案中,能夠兼容后期的擴(kuò)容,增加多臺SALVE與兩臺MASTER異步同步實現(xiàn)數(shù)據(jù)的僅僅讀查詢,實現(xiàn)讀寫分離,提高總體性能。

配置/etc/my.cnf

分別改動/etc/my.cnf配置,打開bin-log功能和設(shè)置server_id

vi /etc/my.cnf

/etc/my.conf代碼

[mysqld]

# MYSQL_DB_MASTER1設(shè)置為1。MYSQL_DB_MASTER2設(shè)置為2

server_id=1

log_bin=mysql-bin

安 裝官方文檔說明,主(MYSQL_DB_MASTER1)須要設(shè)置rpl_semi_sync_master_enabled=1和rpl_semi_sync_master_timeout=1000。備(MYSQL_DB_MASTER2)須要設(shè)置 rpl_semi_sync_slave_enabled=1,這里由于是雙向同步。我都沒有設(shè)置,經(jīng)測試,沒有設(shè)置也沒有關(guān)系(臨時沒有深究,興許在研究下)。

配置MYSQL_DB_MASTER1與MYSQL_DB_MASTER2的主備同步

在MYSQL_DB_MASTER1上操作配置MYSQL_DB_MASTER1為MYSQL_DB_MASTER2的主。

Mysql_db_master1代碼

# mysql-uroot -p

Enterpassword:

......

-- 建立復(fù)制用戶replication,同意內(nèi)網(wǎng)內(nèi)其它機(jī)器(訪問本機(jī)全部數(shù)據(jù)庫)

mysql> grant replication? slave on *.* to'repdb01'@'192.168.150.%' identified by '123456';

QueryOK, 0 rows affected (0.00 sec)

-- 查看master的bin-log狀態(tài),用戶設(shè)置SLAVE同步的起點

mysql>show master status;

+------------------+----------+--------------+------------------+-------------------+

| File???????????? | Position | Binlog_Do_DB |Binlog_Ignore_DB | Executed_Gtid_Set |

+------------------+----------+--------------+------------------+-------------------+

| mysql-bin.000013 |????? 120 |????????????? |????????????????? |?????????????????? |

+------------------+----------+--------------+------------------+-------------------+

1 row in set (0.02 sec)

這里注意記錄下當(dāng)前bin-log文件名:mysql-bin.000013和位置:120。備機(jī)設(shè)置的時候須要用到。

在MYSQL_DB_MASTER2上操作配置

Mysql_db_master2代碼

--設(shè)置SLAVE的MASTER和開始同步的文件位置

mysql>change master tomaster_host='192.168.150.145',master_user='repdb01',master_password='123456',master_log_file='mysql-bin.000003',master_log_pos=120;

--啟動同步

mysql>start slave;

mysql>show slave status\G;

***************************1. row ***************************

Slave_IO_State: Waiting formaster to send event

Master_Host:192.168.150.145

Master_User: repdb01

Master_Port: 3306

Connect_Retry: 10

Master_Log_File:mysql-bin.000013

Read_Master_Log_Pos: 120

Relay_Log_File: acooly2-relay-bin.000020

Relay_Log_Pos: 283

Relay_Master_Log_File:mysql-bin.000013

Slave_IO_Running: Yes

Slave_SQL_Running: Yes

……

1 row in set (0.02sec)

Slave_IO_Running: Yes和Slave_SQL_Running:Yes表示SLAVE已經(jīng)正常啟動并監(jiān)聽MASTER的數(shù)據(jù)發(fā)送事件。處理同步。

配置MYSQL_DB_MASTER2與MYSQL_DB_MASTER1的主備同步

全部配置操作與上一節(jié),僅僅是把主備關(guān)系交換。

OK

假設(shè)全部的配置成功,啟動MASTER1和MASTER2兩個數(shù)據(jù)庫,分別從兩端創(chuàng)建數(shù)據(jù)庫。表和更新表數(shù)據(jù),另外一邊都會實時同步。

也能夠在兩臺機(jī)器中分別配置/etc/my.cnf

210.146

[root@rac2 keepalive]# cat /etc/my.cnf

[mysqld]

datadir=/var/lib/mysql

socket=/var/lib/mysql/mysql.sock

user=mysql

# Default to using old password format for compatibilitywith mysql 3.x

# clients (those using the mysqlclient10 compatibilitypackage).

old_passwords=1

# Disabling symbolic-links is recommended to preventassorted security risks;

# to do so, uncomment this line:

# symbolic-links=0

old_passwords=1

lower_case_table_names=1

default-character-set=utf8

default-storage-engine=innodb

max_connect_errors = 100000

#innodb_buffer_pool_size= 8G

max_connections = 500

default-character-set=utf8

server-id=2

#log-bin=mysqlbin

innodb_flush_log_at_trx_commit=1

sync_binlog=1

init_connect='SET NAMES utf8'

log-bin=mysqlbin

master-host=192.168.150.145

master-user=repdb01

master-pass=123456

master-connect-retry=60

replicate-do-db=db01

replicate-do-db=spring

master-port=3306

slave-net-timeout=60

[mysqld_safe]

log-error=/var/log/mysqld.log

pid-file=/var/run/mysqld/mysqld.pid

[client]

default-character-set=utf8

210.145 上面的配置

[root@rac1 ~]# cat /etc/my.cnf

[mysqld]

datadir=/var/lib/mysql

socket=/var/lib/mysql/mysql.sock

user=mysql

# Default to using old password format for compatibilitywith mysql 3.x

# clients (those using the mysqlclient10 compatibilitypackage).

old_passwords=1

# Disabling symbolic-links is recommended to preventassorted security risks;

# to do so, uncomment this line:

# symbolic-links=0

old_passwords=1

lower_case_table_names=1

default-character-set=utf8

default-storage-engine=innodb

max_connect_errors = 100000

#innodb_buffer_pool_size= 8G

max_connections = 500

default-character-set=utf8

#binlog_format=mixed

server-id=1

master-host=192.168.150.146

master-user=repdb01

master-pass=123456

master-connect-retry=60

replicate-do-db=db01

replicate-do-db=spring

init_connect='SET NAMES utf8'

log-bin=mysqlbin

[mysqld_safe]

log-error=/var/log/mysqld.log

pid-file=/var/run/mysqld/mysqld.pid

[client]

default-character-set=utf8

兩個配置完畢后重新啟動數(shù)據(jù)庫,配置完畢。

4、Keepalived實現(xiàn)MYSQL的高可用

前面已經(jīng)完畢MYSQL的雙向?qū)崟r同步的配置。本節(jié)使用Keepalived實現(xiàn)MYSQL雙機(jī)的高可用,故障轉(zhuǎn)移。通過VIP實現(xiàn)同一時候僅僅有一臺MYSQL提供服務(wù)。

4.1、配置KEEPALIVED

兩臺MYSQLserver上的配置基本同樣(除了keepalived.conf的個別配置外),詳細(xì)操作配置例如以下:

設(shè)置keepalived的主配置文件/etc/keepalived/keepalived.conf實現(xiàn)本機(jī)的MYSQL的監(jiān)控和VIP浮動。

安裝keepalived

tar –zxvf keepalived-1.1.20.tar.gz

cd keepalived-1.1.20

./configure --prefix=/usr/local/keepalived/

make

make install

ln -s /usr/local/keepalived/etc/keepalived /etc/

ln -s /usr/local/keepalived/etc/rc.d/init.d/keepalived/etc/rc.d/init.d/

ln -s /usr/local/keepalived/etc/sysconfig/keepalived/etc/sysconfig/

ln -s /usr/local/keepalived/bin/genhash /bin/

ln -s /usr/local/keepalived/sbin/keepalived /sbin/

configure時注意Use IPVS Framework、IPVS sync daemon support 、Use VRRP Framework要返回yes。否則無法關(guān)聯(lián)ipvs功能

master1 上的配置:

145

vi /etc/keepalived/keepalived.conf

! Configuration File for keepalived

global_defs {

router_id Mysql-HA

}

# 定義MYSQL監(jiān)控的腳本。每2秒監(jiān)控一次,詳細(xì)腳本請見以下

vrrp_scriptcheck_mysql {

script"/root/keepalive/keepalived_check_mysql.sh"

interval 2

}

vrrp_sync_groupVG1 {

group {

KEEPALIVED_MYSQL

}

}

vrrp_instanceKEEPALIVED_MYSQL {

# 注意:兩臺MYSQLserver都設(shè)置為BACKUP

stateBACKUP

interface eth0

virtual_router_id 20

#? # MASTER1設(shè)置為100,則MASTER2設(shè)置為稍低,如:90

priority 100

advert_int 1

# 僅僅有MASTER1設(shè)置不搶奪控制權(quán)

nopreempt

authentication {

auth_type PASS

auth_pass abcd1234

}

track_script {

check_mysql

}

virtual_ipaddress {

192.168.150.201

}

}

146上面的配置

! Configuration File for keepalived

global_defs {

router_id Mysql-HA

}

#定義MYSQL監(jiān)控的腳本,每2秒監(jiān)控一次,詳細(xì)腳本請見以下

vrrp_scriptcheck_mysql {

script"/root/keepalive/keepalived_check_mysql.sh"

interval 2

}

vrrp_sync_groupVG1 {

group {

KEEPALIVED_MYSQL

}

}

vrrp_instanceKEEPALIVED_MYSQL {

#注意:兩臺MYSQLserver都設(shè)置為BACKUP

stateBACKUP

interface eth0

virtual_router_id 20

#MASTER1設(shè)置為100 MASTER2設(shè)置為90

priority 90

advert_int 1

authentication {

auth_type PASS

auth_pass abcd1234

}

track_script {

check_mysql

}

virtual_ipaddress {

192.168.150.201

}

}

檢查本機(jī)MYSQL服務(wù)是否正常,假設(shè)MYSQL服務(wù)不可用,則停止KEEPALIVED服務(wù),由備機(jī)的KEEPALIVED接管并提供VIP(指向備機(jī))

/root/keepalive/keepalived_check_mysql.sh代碼

[root@rac2 keepalive]# cat /root/keepalive/keepalived_check_mysql.sh

#!/bin/bash

MYSQL=/usr/bin/mysql

MYSQL_HOST=localhost

#MYSQL_USER=root

#MYSQL_PASSWORD=root

LOG_FILE=/root/keepalive/check_mysql.log

CHECK_TIME=3

#mysqlis working MYSQL_OK is 1 , mysql down MYSQL_OK is 0

MYSQL_OK=1

functioncheck_mysql_helth (){

$MYSQL -h $MYSQL_HOST -e "showstatus;" >/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

echo `date --date=today +"%Y-%m-%d%H:%M:%S"` -? [INFO] - mysqlavailable: success[$MYSQL_OK] >> $LOG_FILE

exit 0

fi

if [ $MYSQL_OK -eq 0 ] && [$CHECK_TIME -eq 0 ]

then

/etc/init.d/keepalived stop

echo `date --date=today +"%Y-%m-%d%H:%M:%S"` -? [INFO] - mysqlinvaild. keepalived stop. >> $LOG_FILE

exit 1

fi

sleep 1

done

4.2、驗證故障轉(zhuǎn)移

配置完畢后。分別啟動兩臺server的mysql和keepalived服務(wù)

分別啟動MYSQL_DB_MASTER1和MYSQL_DB_MASTER2

詳細(xì)命令例如以下:

# service mysql start

Starting MySQL.......... SUCCESS!

# service keepalived start

Starting keepalived:???????????????????????????????????? [? OK? ]

在MYSQL_DB_MASTER1查看VIP

Ip a

[root@rac1 keepalive]# ip a

1: lo: mtu 16436 qdiscnoqueue

link/loopback00:00:00:00:00:00 brd 00:00:00:00:00:00

inet127.0.0.1/8 scope host lo

inet6 ::1/128scope host

valid_lftforever preferred_lft forever

2: eth0: mtu 1500qdisc pfifo_fast qlen 1000

link/etherbe:0c:3f:74:0f:b8 brd ff:ff:ff:ff:ff:ff

inet192.168.150.145/24 brd 192.168.150.255 scope global eth0

inet 192.168.150.201/32 scope global eth0

inet192.168.150.245/24 brd 192.168.150.255 scope global secondary eth0:2

inet6fe80::bc0c:3fff:fe74:fb8/64 scope link

valid_lftforever preferred_lft forever

3: eth1: mtu 1500qdisc pfifo_fast qlen 1000

link/etherca:d9:c2:ab:89:c8 brd ff:ff:ff:ff:ff:ff

inet10.10.10.145/24 brd 10.10.10.255 scope global eth1

inet6fe80::c8d9:c2ff:feab:89c8/64 scope link

valid_lftforever preferred_lft forever

4: sit0: mtu 1480 qdisc noop

link/sit 0.0.0.0brd 0.0.0.0

210.201 在145 上面

從另外一臺機(jī)器用vip地址登陸

mysql -h 192.168.150.201? -utest -p

查看時連接那一臺機(jī)器

mysql> show variables like '%host%'

-> ;

+---------------+-------+

| Variable_name | Value |

+---------------+-------+

| hostname???? | rac1? |

+---------------+-------+

1 row in set (0.00 sec)

然后停止rac1上的mysql

依舊查看連接的狀態(tài)

mysql> show variables like '%host%';

ERROR 2006 (HY000): MySQL server has gone away

No connection. Trying to reconnect...

Connection id:?? 4274

Current database: *** NONE ***

+---------------+-------+

| Variable_name | Value |

+---------------+-------+

| hostname???? | rac2? |

+---------------+-------+

1 row in set (3.09 sec)

mysql>

mysql> show variables like '%host%';

+---------------+-------+

| Variable_name | Value |

+---------------+-------+

| hostname???? | rac2? |

+---------------+-------+

1 row in set (0.00 sec)

發(fā)現(xiàn)已經(jīng)轉(zhuǎn)移到mysql_db_master2上面

[root@rac1 keepalive]# service keepalived status

keepalived is stopped

查看keepalive的狀態(tài)

以及mysql的檢查日志

查看日志 [root@rac1 keepalive]# catcheck_mysql.log

2014-11-05 18:29:37 - [INFO] - mysql available:success[1]

2014-11-05 18:29:42 - [INFO] - mysql invaild.keepalived stop.

2014-11-05 18:29:43 - [INFO] - mysql invaild.keepalived stop.

發(fā)現(xiàn)服務(wù)已經(jīng)停止

[root@rac2 keepalive]# ip a? 在主機(jī)2上查看ip情況

1: lo: mtu 16436 qdiscnoqueue

link/loopback00:00:00:00:00:00 brd 00:00:00:00:00:00

inet127.0.0.1/8 scope host lo

inet6 ::1/128scope host

valid_lftforever preferred_lft forever

2: eth0: mtu 1500qdisc pfifo_fast qlen 1000

link/ether42:1c:5e:e1:1c:3e brd ff:ff:ff:ff:ff:ff

inet192.168.150.146/24 brd 192.168.150.255 scope global eth0

inet 192.168.150.201/32 scope global eth0

能夠看到VIP(210.201)已經(jīng)切換到MYSQL_DB_MASTER2

從新啟動MYSQL_DB_MASTER1的MYSQL服務(wù)和KEEPALIVED服務(wù)。可是這個時候是不會從新浮動到MASTER1的。由于我們配置 KEEPALIVED的時候都是配置的BACKUP。并且MASTER1配置了不搶占。

這與我們設(shè)計是相符的。(僅僅有等MASTER2出現(xiàn)問題的情況才從新有MASTER1接管)

這樣的方式能夠避免一臺機(jī)器出現(xiàn)故障手動切換才干使服務(wù)恢復(fù)。提高系統(tǒng)的高可用性。

興許多臺雙活實驗進(jìn)行中,敬請期待。

總結(jié)

以上是生活随笔為你收集整理的mysql keepalived双主双活_mysql高可用架构方案之中的一个(keepalived+主主双活)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。