1. 程式人生 > 實用技巧 >linux系統mysql資料庫Atlas安裝及分表操作

linux系統mysql資料庫Atlas安裝及分表操作

#問題:
1.去掉VIP飄逸的指令碼後,MHA切換時仍然報錯說要讀取指令碼
	#報錯:
	master_ip_failover_script or purge_relay_log 在同一臺機器執行
	#解決:
	重新寫一個MHA配置檔案

一、VIP漂移

1.配置MHA讀取指令碼

[root@db03 ~]# vim /service/mha/app1.cnf
#在[server default]標籤下新增
[server default]
#使用MHA自帶指令碼
master_ip_failover_script=/usr/local/bin/master_ip_failover

2.編寫指令碼

[root@db03 ~]# vim /service/mha/master_ip_failover 
......
my $vip = '172.16.1.50/24';
my $key = '1';
my $ssh_start_vip = "/sbin/ifconfig eth1:$key $vip";
my $ssh_stop_vip = "/sbin/ifconfig eth1:$key down";
......

3.手動繫結VIP

ifconfig eth1:1 172.16.1.50/24

4.啟動MHA

二、binlog server

1.配置

[root@db03 ~]# vim /service/mha/app1.cnf
[server default]
manager_log=/service/mha/manager
manager_workdir=/service/mha/app1
master_binlog_dir=/usr/local/mysql/data
password=mha
ping_interval=2
repl_password=123
repl_user=rep
ssh_user=root
user=mha
master_ip_failover_script=/service/mha/master_ip_failover

[server1]
hostname=172.16.1.51
port=3306

[server2]
hostname=172.16.1.52
port=3306

#開啟binlog server
[server3]
hostname=172.16.1.53
port=3306
no_master=1
master_binlog_dir=/root/binlog/

2.建立目錄

#建立備份binlog目錄
[root@db03 ~]# mkdir -p /root/binlog/

3.手動備份

#進入該目錄
[root@db03 ~]# cd /data/mysql/binlog/
#備份binlog
[root@db03 ~]# mysqlbinlog  -R --host=10.0.0.51 --user=mha --password=mha --raw  --stop-never mysql-bin.000001 &

4.重啟MHA

#啟動mha
[root@db03 ~]# nohup masterha_manager --conf=/service/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /service/mha/manager.log 2>&1 &

三、恢復MHA與binlog指令碼

1.node節點上的指令碼

[root@db02 ~]# vim start_mha.sh 

#判斷資料庫是否掛掉
mysql_pid=`ps -ef | grep [m]ysqld | wc -l`

#如果掛掉則重啟,如果沒掛則殺掉重啟
if [ $mysql_pid -eq 0 ];then
    systemctl start mysqld
else
    systemctl restart mysqld
fi

sleep 3

#獲取change master to語句
change=`ssh 172.16.1.53 "grep 'CHANGE MASTER TO' /service/mha/manager | tail -1 | sed 's#xxx#123#g'" | awk -F: '{print $4}'` &&\

#重啟的資料庫執行change master to
mysql -e "$change;start slave"

#修復MHA配置檔案
ssh 172.16.1.53 "\cp /service/mha/app1.cnf.bak /service/mha/app1.cnf" &&\

#遠端啟動MHA
ssh 172.16.1.53 "/bin/bash /root/start_bin.sh"

2.manager節點上的指令碼

[root@db03 ~]# vim start_bin.sh 

#獲取主機地址
mha_master_host=`grep 'as a new master' /service/mha/manager | tail -1 | awk -F "[ ,(]" '{print $2}'`

#啟動儲存binlog
cd /root/binlog/

nohup mysqlbinlog -R --host="$mha_master_host" --user=mha --password=mha --raw --stop-never mysql-bin.000001 >/dev/null &

#啟動MHA
nohup masterha_manager --conf=/service/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /service/mha/manager.log 2>&1 &

四、Atlas 讀寫分離

1.Atals介紹

1)簡介

Atlas是由 Qihoo 360公司Web平臺部基礎架構團隊開發維護的一個基於MySQL協議的資料中間層專案。它在MySQL官方推出的MySQL-Proxy 0.8.2版本的基礎上,修改了大量bug,添加了很多功能特性。它在MySQL官方推出的MySQL-Proxy 0.8.2版本的基礎上,修改了大量bug,添加了很多功能特性。

2)主要功能

1.讀寫分離
2.從庫負載均衡
3.IP過濾
4.自動分表
5.DBA可平滑上下線DB
6.自動摘除宕機的DB

3)Atlas相對於官方MySQL-Proxy的優勢

1.將主流程中所有Lua程式碼用C重寫,Lua僅用於管理介面
2.重寫網路模型、執行緒模型
3.實現了真正意義上的連線池
4.優化了鎖機制,效能提高數十倍

2.安裝Atlas

1)上傳或下載包

[root@db03 ~]# rz Atlas-2.2.1.el6.x86_64.tmp

2)安裝

[root@db03 ~]# yum localinstall -y Atlas-2.2.1.el6.x86_64.rpm

3)確認檔案

[root@db03 ~]# ll /usr/local/mysql-proxy/
total 0
drwxr-xr-x 2 root root  75 Jul 29 10:15 bin
drwxr-xr-x 2 root root  22 Jul 29 10:15 conf
drwxr-xr-x 3 root root 331 Jul 29 10:15 lib
drwxr-xr-x 2 root root   6 Dec 17  2014 log

4)配置

[root@db03 ~]# cat /usr/local/mysql-proxy/conf/test.cnf
[mysql-proxy]
#管理介面的使用者名稱
admin-username = user
#管理介面的密碼
admin-password = pwd
#Atlas後端連線的MySQL主庫的IP和埠,可設定多項,用逗號分隔
proxy-backend-addresses = 172.16.1.50:3306
#Atlas後端連線的MySQL從庫的IP和埠,@後面的數字代表權重,用來作負載均衡,若省略則預設為1,可設定多項,用逗號分隔
proxy-read-only-backend-addresses = 172.16.1.51:3306,172.16.1.53:3306
#使用者名稱與其對應的加密過的MySQL密碼,密碼使用PREFIX/bin目錄下的加密程式encrypt加密,下行的user1和user2為示例,將其替換為你的MySQL的使用者名稱和加密密碼!
pwds = rep:3yb5jEku5h4=,mha:O2jBXONX098=
#設定Atlas的執行方式,設為true時為守護程序方式,設為false時為前臺方式,一般開發除錯時設為false,線上執行時設為true,true後面不能有空格。
daemon = true
#設定Atlas的執行方式,設為true時Atlas會啟動兩個程序,一個為monitor,一個為worker,monitor在worker意外退出後會自動將其重啟,設為false時只有worker,沒有monitor,一般開發除錯時設為false,線上執行時設為true,true後面不能有空格。
keepalive = true
#工作執行緒數,對Atlas的效能有很大影響,可根據情況適當設定
event-threads = 8
#日誌級別,分為message、warning、critical、error、debug五個級別
log-level = error
#日誌存放的路徑
log-path = /usr/local/mysql-proxy/log
#SQL日誌的開關,可設定為OFF、ON、REALTIME,OFF代表不記錄SQL日誌,ON代表記錄SQL日誌,REALTIME代表記錄SQL日誌且實時寫入磁碟,預設為OFF
sql-log = OFF
#慢日誌輸出設定。當設定了該引數時,則日誌只輸出執行時間超過sql-log-slow(單位:ms)的日誌記錄。不設定該引數則輸出全部日誌。
#sql-log-slow = 10
#例項名稱,用於同一臺機器上多個Atlas例項間的區分
instance = test
#Atlas監聽的工作介面IP和埠
proxy-address = 0.0.0.0:1234
#Atlas監聽的管理介面IP和埠
admin-address = 0.0.0.0:2345
#分表設定,此例中person為庫名,mt為表名,id為分表字段,3為子表數量,可設定多項,以逗號分隔,若不分表則不需要設定該項
#tables = person.mt.id.3
#預設字符集,設定該項後客戶端不再需要執行SET NAMES語句
#charset = utf8
#允許連線Atlas的客戶端的IP,可以是精確IP,也可以是IP段,以逗號分隔,若不設定該項則允許所有IP連線,否則只允許列表中的IP連線
client-ips = 127.0.0.1

5)啟動

[root@db03 ~]# /usr/local/mysql-proxy/bin/mysql-proxyd test start
OK: MySQL-Proxy of test is started

#檢驗啟動
[root@db03 conf]# netstat -lntp
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 0.0.0.0:2345            0.0.0.0:*               LISTEN      31101/mysql-proxy     
tcp        0      0 0.0.0.0:1234            0.0.0.0:*               LISTEN      31101/mysql-proxy   

3.Atlas使用

1.連線資料庫
[root@db03 ~]# mysql -uuser -ppwd -P 2345 -h127.0.0.1

2.執行命令
mysql> show databases;
ERROR 1105 (07000): use 'SELECT * FROM help' to see the supported commands

mysql> SELECT * FROM help;
+----------------------------+---------------------------------------------------------+
| command                    | description                                             |
+----------------------------+---------------------------------------------------------+
| SELECT * FROM help         | 檢視幫助		                                           |
| SELECT * FROM backends     | 檢視後端資料庫主機列表					                |
| SET OFFLINE $backend_id    | DBA可平滑下線DB 									    |
| SET ONLINE $backend_id     | DBA可平滑上線DB     			                          |
| ADD MASTER $backend        | 新增主庫								                 |
| ADD SLAVE $backend         | 新增從庫								                 |
| REMOVE BACKEND $backend_id | 移除後端資料庫				                            |
| SELECT * FROM clients      | 客戶端列表                                               |
| ADD CLIENT $client         | 臨時新增客戶端						                   |
| REMOVE CLIENT $client      | 臨時移除客戶端    							           |
| SELECT * FROM pwds         | 客戶端使用者名稱和密碼                                        |
| ADD PWD $pwd               | 新增客戶端使用者名稱和密碼					                 |
| ADD ENPWD $pwd             | 新增客戶端使用者名稱和加密後的密碼					          |
| REMOVE PWD $pwd            | 移除客戶端使用者					                        |
| SAVE CONFIG                | 儲存配置到配置檔案               				           |
| SELECT VERSION             | 檢視Atlas版本			                               |
+----------------------------+---------------------------------------------------------+
16 rows in set (0.00 sec)

五、Atlas結合MHA故障恢復

1.思路

1.找到新的主庫
2.將新的主庫從Atlas中配置下線
3.儲存到配置檔案

2.寫指令碼

[root@db03 ~]# vim switch_Atlas.sh 
#/bin/bash
#1.獲取新的主庫IP
new_master=`grep "as a new master" /service/mha/manager | tail -1 | awk -F '[ ,(]' '{print $2}'`
#2.獲取新的主庫在Atlas中的ID
new_master_id=`mysql -uuser -ppwd -h127.0.0.1 -P 2345 -e "SELECT * FROM backends" | grep $new_master | awk '{print $1}'`
#3.移除提升為主庫的從庫
mysql -uuser -ppwd -h127.0.0.1 -P 2345 -e "REMOVE BACKEND $new_master_id" &> /dev/null
#4.找到掛掉的主機
down_server=`grep "Master .* is down" /service/mha/manager | tail -1 | awk -F '[ ,(]' '{print $2}'`
#5.遠端連線執行恢復指令碼
ssh $down_server "sh /root/start_mha.sh"
#6.獲取掛掉的主機的IP加埠
down_server_port=`grep "Master .* is down" /service/mha/manager | tail -1 | awk -F '[ ,()]' '{print $3}'`
#7.新增down的主庫為新的從庫到Atlas
mysql -uuser -ppwd -h127.0.0.1 -P 2345 -e "add slave $down_server_port" &> /dev/null
#8.儲存配置
mysql -uuser -ppwd -h127.0.0.1 -P 2345 -e "save config" &> /dev/null

六、Atlas分表

1.為什麼要分表

1.資料過多,訪問緩慢(800w)
2.建立索引時重新排序,建立緩慢,並且佔用大量的磁碟空間

2.分表的方式

1.根據資料範圍分表
2.根據取模的方式(取餘數)

3.分表

1)思路

1.確定分表的庫,表,欄位
2.確定分表的數量
3.分表的名字,stu_0,stu_1,stu_2
4.配置檔案配置分表的規則
5.測試

2)建立原表

mysql> create database school;
Query OK, 1 row affected (0.00 sec)

mysql> use school
Database changed
mysql> create table stu(id int,name varchar(10));
Query OK, 0 rows affected (0.13 sec)

3)建立分表

mysql> create table stu_0 like stu;
Query OK, 0 rows affected (0.08 sec)

mysql> create table stu_1 like stu;
Query OK, 0 rows affected (0.03 sec)

mysql> create table stu_2 like stu;
Query OK, 0 rows affected (0.03 sec)

4)配置Atlas

[root@db03 ~]# vim /usr/local/mysql-proxy/conf/test.cnf
#分表設定,此例中person為庫名,mt為表名,id為分表字段,3為子表數量,可設定多項,以逗號分隔,若不分表則不需要設定該項
tables = school.stu.id.3

[root@db03 ~]# /usr/local/mysql-proxy/bin/mysql-proxyd test restart
OK: MySQL-Proxy of test is stopped
OK: MySQL-Proxy of test is started

5)測試

1.分表操作

#連線Atlas負載資料庫
[root@db03 ~]# mysql -umha -pmha -h127.0.0.1 -P 1234
mysql> show databases;

#建立庫
mysql> create database school;
Query OK, 1 row affected (0.04 sec)

#切換庫
mysql> use school
Database changed

#建立原始表
mysql> create table stu(id int,name varchar(10));
Query OK, 0 rows affected (0.03 sec)

#建立分表
mysql> create table stu_0 like stu;
Query OK, 0 rows affected (0.03 sec)

mysql> create table stu_1 like stu;
Query OK, 0 rows affected (0.04 sec)

mysql> create table stu_2 like stu;
Query OK, 0 rows affected (0.03 sec)

#插入資料
mysql> insert into stu values(1,'lhd');
Query OK, 1 row affected (0.01 sec)

mysql> insert into stu values(2,'lhd');
Query OK, 1 row affected (0.00 sec)

mysql> insert into stu values(3,'lhd3');
Query OK, 1 row affected (0.01 sec)

mysql> insert into stu values(11,'lhd3');
Query OK, 1 row affected (0.01 sec)

mysql> insert into stu values(12,'lhd3');
Query OK, 1 row affected (0.00 sec)

mysql> insert into stu values(13,'lhd3');
Query OK, 1 row affected (0.02 sec)

#檢視資料
mysql> select * from stu;
Empty set (0.00 sec)

mysql> select * from stu_0;
+------+------+
| id   | name |
+------+------+
|    3 | lhd3 |
|   12 | lhd3 |
+------+------+
2 rows in set (0.03 sec)

mysql> select * from stu_1;
+------+------+
| id   | name |
+------+------+
|    1 | lhd  |
|   13 | lhd3 |
+------+------+
2 rows in set (0.00 sec)

mysql> select * from stu_2;
+------+------+
| id   | name |
+------+------+
|    2 | lhd  |
|   11 | lhd3 |
+------+------+
2 rows in set (0.00 sec)

#如果想檢視原表資料,需要加where條件
mysql> select * from stu where id=1;
+------+------+
| id   | name |
+------+------+
|    1 | lhd  |
+------+------+
1 rows in set (0.00 sec)