共計 11649 個字符,預計需要花費 30 分鐘才能閱讀完成。
本篇內容介紹了“MYSQL 主從和 ATLAS 讀寫分離的搭建”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓丸趣 TV 小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
一、環境準備
操作系統 CENTOS 7.5
數據庫 MYSQL5.6.40
ATLAS2.2.1
IP 地址
主庫 192.168.56.118
備庫 192.168.56.119
ATLAS 中間件 192.168.56.117
我這里只寫的是普通的讀寫分離搭建,沒有那些 share 分表之類的那么多復雜的,以后有時間了再搞~_~
MYSQL 主從搭建,這個,其實可以直接去看我寫的一篇 MYSQL 主從和主主的文章
http://blog.itpub.net/28371090/viewspace-2154828/
已經很詳細了,下面再寫一遍,只是想要更簡潔一些。
MYSQL5.6.40 下載地址(源碼包)
https://downloads.mysql.com/archives/get/file/mysql-5.6.40.tar.gz
ATLAS2.2.1 下載地址
https://github.com/Qihoo360/Atlas/releases/tag/2.2.1
兩臺服務器一樣的安裝方式
二、MYSQL 源碼安裝
使用本地 yum 源
[520]
name=520
baseurl=file:///mnt/cdrom
gpgcheck=0
enabled=1
1、安裝依賴
yum -y install make gcc-c++ cmake bison-devel ncurses-devel perl
2、創建用戶和組
groupadd mysql
useradd mysql -g mysql -M -s /sbin/nologin
3、解壓 tar -zxvf mysql-5.6.40.tar.gz
cd /opt/
tar -zxvf mysql-5.6.40.tar.gz -C /opt/
cd /opt/mysql-5.6.40
mkdir /data/mysql5.6.40/
4、編譯安裝
cmake -DCMAKE_INSTALL_PREFIX=/opt/mysql-5.6.40/ -DMYSQL_DATADIR=/data/mysql5.6.40/ -DSYSCONFDIR=/etc -DWITH_MYISAM_STORAGE_ENGINE=1 -DWITH_INNOBASE_STORAGE_ENGINE=1 -DWITH_MEMORY_STORAGE_ENGINE=1 -DWITH_READLINE=1 -DMYSQL_UNIX_ADDR=/tmp/mysqld.sock -DMYSQL_TCP_PORT=3306 -DENABLED_LOCAL_INFILE=1 -DWITH_PARTITION_STORAGE_ENGINE=1 -DEXTRA_CHARSETS=all -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci
5、編譯
make make install
6、目錄授權
chown mysql.mysql /data/mysql5.6.40/
mkdir /data/mysql5.6.40/log
chown mysql.mysql /data/mysql5.6.40/log
7、數據庫初始化
cd /opt/mysql-5.6.40/
./scripts/mysql_install_db –user=mysql –datadir=/data/mysql5.6.40/
8、配置環境變量
vi /root/.bash_profile 在最后一行添加
PATH=$PATH:$HOME/bin:/data/mysql5.6.40/bin:/data/mysql5.6.40/lib
三、MYSQL5.6.40 主從搭建
1、Master 端配置部署 a、在主服務器上的 my.cnf 配置文件中的 [mysqld] 節點下添加以下配置
vi /etc/my.cnf
[mysqld]
server-id=101
default-storage-engine=InnoDB
lower_case_table_names=1
log-bin=/data/mysql5.6.40/log/mysql-bin.log
log-bin-index=/data/mysql5.6.40/log/mysql-bin.index
expire_logs_days=30
datadir=/data/mysql5.6.40/
socket=/tmp/mysql.sock
user=mysql
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
[mysqld_safe]
#log-error=/data/mysql5.6.40/mysqld.log
#pid-file=/data/mysql5.6.40/mysqld.pid
這里有遇到啟動不了的情況就注釋掉
啟動數據庫
傳統啟動方式
/usr/local/mysql/bin/mysqld_safe –user=mysql
制作成服務啟動
cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysql
查看啟動是否成功
netstat -tnl|grep 3306
ps -ef|grep mysql
相關命令
service mysql start
停止 mysql 服務
service mysql stop
重啟 mysql 服務
service mysql restart
添加到開機啟動項
chkconfig –add mysql
b、創建用戶,并賦予權限:
登陸數據庫時報錯
ERROR 2002 (HY000): Can t connect to local MySQL server through socket /tmp/mysqld.sock (2)
ln -s /tmp/mysql.sock /tmp/mysqld.sock
登陸
mysql -uroot
create user repl_user;
GRANT REPLICATION SLAVE ON *.* TO repl @ % IDENTIFIED BY PASSWORD ******
設置密碼時會遇到報錯:
ERROR 1372 (HY000): Password hash should be a 41-digit hexadecimal number
解決辦法:用 select password(你想輸入的密碼 查詢出你的密碼對應的字符串
select password(123456
查出的是 *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9
GRANT REPLICATION SLAVE ON *.* TO repl_user @ % IDENTIFIED BY PASSWORD *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9
2、Slave 端配置部署
vi /etc/my.cnf
[mysqld]
server-id=102
default-storage-engine=InnoDB
lower_case_table_names=1
log-bin=/data/mysql5.6.40/log/mysql-bin.log
log-bin-index=/data/mysql5.6.40/log/mysql-bin.index
expire_logs_days=30
datadir=/data/mysql5.6.40/
socket=/tmp/mysql.sock
user=mysql
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
[mysqld_safe]
#log-error=/data/mysql5.6.40/mysqld.log
#pid-file=/data/mysql5.6.40/mysqld.pid
3、建立主從同步
由于我這里是新搭建的庫,直接創建即可,不需要搞什么備份導入
主庫:
登錄 mysql
show master status;
記住 file 和 position
mysql show master status;
+——————+———-+————–+——————+——————-+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+——————+———-+————–+——————+——————-+
| mysql-bin.000002 | 120 | | | |
+——————+———-+————–+——————+——————-+
1 row in set (0.00 sec)
從庫:
登錄 mysql
change master to
master_host= 192.168.56.118 ,
master_port=3306,
master_user= repl_user ,
master_password= 123456 ,
master_log_file= mysql-bin.000002 ,
master_log_pos=120;
配置成功后,啟動 slave
start slave;
驗證主從是否搭建成功在從庫執行
show slave status \G;
看到兩個 YES 就 OK
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
在主庫創建一個表
use test
create table aa (name char(10));
insert into aa values(Tom
在從庫查詢
use test
select * from aa;
查到剛剛插入的數據就 O 了
mysql use mysql;
mysql desc user;
mysql GRANT ALL PRIVILEGES ON *.* TO root@ % IDENTIFIED BY root // 授權遠程連接
mysql update user set Password = password(123456) where User= root // 設置 root 用戶密碼
mysql select Host,User,Password from user where User= root
mysql flush privileges;
mysql exit
四、報錯問題處理:
MYSQL 啟動報錯
(1)
報錯現象:
[root@node1 mysql]# service mysql start
Starting MySQL.. ERROR! The server quit without updating PID file (/var/lib/mysql/node1.pid).
查看報錯日志:
[root@node1 mysql]# tail /var/log/mysqld.log
190512 19:59:10 InnoDB: Starting an apply batch of log records to the database…
InnoDB: Progress in percents: 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
InnoDB: Apply batch completed
190512 19:59:10 InnoDB: Waiting for the background threads to start
190512 19:59:11 InnoDB: 5.5.40 started; log sequence number 1595675
190512 19:59:11 [Note] Server hostname (bind-address): 0.0.0.0 port: 3306
190512 19:59:11 [Note] – 0.0.0.0 resolves to 0.0.0.0
190512 19:59:11 [Note] Server socket created on IP: 0.0.0.0 .
190512 19:59:11 [ERROR] Fatal error: Can t open and lock privilege tables: Table mysql.host doesn t exist
190512 19:59:11 mysqld_safe mysqld from pid file /var/lib/mysql/node1.pid ended
解決方法:
查看配置文件,發現配置文件中 datadir 目錄是默認的,需要修改成自己設置的 /usr/local/mysql/data/
[root@node1 mysql]# cat /etc/my.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
[root@node1 mysql]# vi /etc/my.cnf
datadir=/usr/local/mysql/data/
修改完成后重新啟動 MYSQL 成功
[root@node1 mysql]# service mysql start
Starting MySQL.. SUCCESS!
(2)
報錯現象:
[root@node1 mysql]# /usr/local/mysql/bin/mysql -uroot
ERROR 2002 (HY000): Can t connect to local MySQL server through socket /tmp/mysql.sock (2)
查看配置文件發現 socket 文件在 /var/lib/mysql/mysql.sock,而不是在 /tmp/mysql.sock
[root@node1 mysql]# cat /etc/my.cnf
[mysqld]
datadir=/usr/local/mysql/data/
socket=/var/lib/mysql/mysql.sock
user=mysql
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
解決方法:
設置軟鏈接
ln -s /var/lib/mysql/mysql.sock /tmp/mysql.sock
或者,修改配置文件
注意一個問題,在生產環境,要注意時區問題
vi /etc/my.cnf
[mysqld]
default-time_zone = +8:00
使用北京時間的時區
注意事項:
mysql 異常宕機情況下,如果未設置 sync_binlog= 1 或者 innodb_flush_log_at_trx_commit= 1 很有可能出現 binlog 或者 relaylog 文件出現損壞,導致主從不一致。
五、ATLAS 讀寫分離配置
ATLAS2.2.1 下載地址
https://github.com/Qihoo360/Atlas/releases/tag/2.2.1
Atlas-2.2.1.el6.x86_64.rpm
rpm -ivh Atlas-2.2.1.el6.x86_64.rpm
安裝完成后,它會默認在”/usr/local/mysql-proxy”目錄下生成 4 個文件夾,以及需要配置的文件,如下:
[root@localhost ~]# ll /usr/local/mysql-proxy/
total 4
drwxr-xr-x. 2 root root 75 Jul 30 14:27 bin
drwxr-xr-x. 2 root root 22 Jul 30 16:35 conf
drwxr-xr-x. 3 root root 4096 Jul 30 14:27 lib
drwxr-xr-x. 2 root root 38 Jul 30 16:35 log
bin 目錄下放的都是可執行文件
1.“encrypt”是用來生成 MySQL 密碼加密的,在配置的時候會用到
2.“mysql-proxy”是 MySQL 自己的讀寫分離代理
3.“mysql-proxyd”是 360 弄出來的,后面有個“d”,服務的啟動、重啟、停止。都是用他來執行的
conf 目錄下放的是配置文件
1.“test.cnf”只有一個文件,用來配置代理的,可以使用 vim 來編輯
lib 目錄下放的是一些包,以及 Atlas 的依賴
log 目錄下放的是日志,如報錯等錯誤信息的記錄
進入 bin 目錄,使用 encrypt 來對數據庫的密碼進行加密,我的 MySQL 數據的用戶名是 buck,密碼是 hello,我需要對密碼進行加密
[root@localhost bin]# ./encrypt hello
RePBqJ+5gI4=
配置 Atlas,使用 vim 進行編輯
[root@localhost conf]# cd /usr/local/mysql-proxy/conf/
[root@localhost conf]# vim test.cnf
這是用來登錄到 Atlas 的管理員的賬號與密碼,與之對應的是“#Atlas 監聽的管理接口 IP 和端口”,也就是說需要設置管理員登錄的端口,才能進入管理員界面,默認端口是 2345,也可以指定 IP 登錄,指定 IP 后,其他的 IP 無法訪問管理員的命令界面。方便測試,我這里沒有指定 IP 和端口登錄。
# 管理接口的用戶名
admin-username = user
# 管理接口的密碼
admin-password = pwd
這里的管理接口用戶名和密碼也用的是默認的
這是用來配置主數據的地址與從數據庫的地址,這里配置的主數據庫是 118,從數據庫是 119
#Atlas 后端連接的 MySQL 主庫的 IP 和端口,可設置多項,用逗號分隔
proxy-backend-addresses = 192.168.56.118:3306
#Atlas 后端連接的 MySQL 從庫的 IP 和端口,@后面的數字代表權重,用來作負載均衡,若省略則默認為 1,可設置多項,用逗號分隔
proxy-read-
這個是用來配置 MySQL 的賬戶與密碼的,我的 MySQL 的用戶是 buck, 密碼是 hello, 剛剛使用 Atlas 提供的工具生成了對應的加密密碼
# 用戶名與其對應的加密過的 MySQL 密碼,密碼使用 PREFIX/bin 目錄下的加密程序 encrypt 加密,下行的 user1 和 user2 為示例,將其替換為你的 MySQL 的用戶名和加密密碼!pwds = buck:RePBqJ+5gI4=
(RePBqJ+5gI4= 這個就是前面自己加密過的密碼,填上去)
這是設置工作接口與管理接口的,如果 ip 設置的”0.0.0.0”就是說任意 IP 都可以訪問這個接口,當然也可以指定 IP 和端口,方便測試我這邊沒有指定,工作接口的用戶名密碼與 MySQL 的賬戶對應的,管理員的用戶密碼與上面配置的管理員的用戶密碼對應。
#Atlas 監聽的工作接口 IP 和端口
proxy-address = 0.0.0.0:1234
#Atlas 監聽的管理接口 IP 和端口
admin-address = 0.0.0.0:2345
啟動 Atlas
[root@localhost bin]# ./mysql-proxyd test start
OK: MySQL-Proxy of test is started
再 ATLAS 機器上,我是沒有安裝 MYSQL 的。
/etc/init.d/mysqld status 測試下也沒問題,不過對于我來說意義不大,我根本沒安裝
ps -ef |grep mysql
使用如下命令,進入 Atlas 的管理模式“mysql -h227.0.0.1 -P2345 -uuser -ppwd ”,能進去說明 Atlas 正常運行著呢,因為它會把自己當成一個 MySQL 數據庫,所以在不需要數據庫環境的情況下,也可以進入到 MySQL 數據庫模式。
[root@localhost bin]# mysql -h227.0.0.1 -P2345 -uuser -ppwd
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.0.99-agent-admin
Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type help; or \h for help. Type \c to clear the current input statement.
mysql
可以訪問“help”表,來看 MySQL 管理員模式都能做些什么。可以使用 SQL 語句來訪問
mysql select * from help;
+—————————-+———————————————————+
| command | description |
+—————————-+———————————————————+
| SELECT * FROM help | shows this help |
| SELECT * FROM backends | lists the backends and their state |
| SET OFFLINE $backend_id | offline backend server, $backend_id is backend_ndx s id |
| SET ONLINE $backend_id | online backend server, … |
| ADD MASTER $backend | example: add master 127.0.0.1:3306 , … |
| ADD SLAVE $backend | example: add slave 127.0.0.1:3306 , … |
| REMOVE BACKEND $backend_id | example: remove backend 1 , … |
| SELECT * FROM clients | lists the clients |
| ADD CLIENT $client | example: add client 192.168.1.2 , … |
| REMOVE CLIENT $client | example: remove client 192.168.1.2 , … |
| SELECT * FROM pwds | lists the pwds |
| ADD PWD $pwd | example: add pwd user:raw_password , … |
| ADD ENPWD $pwd | example: add enpwd user:encrypted_password , … |
| REMOVE PWD $pwd | example: remove pwd user , … |
| SAVE CONFIG | save the backends to config file |
| SELECT VERSION | display the version of Atlas |
+—————————-+———————————————————+
16 rows in set (0.00 sec)
mysql
也可以使用工作接口來訪問,使用命令“mysql -h227.0.0.1 -P1234 -ubuck -phello”
[root@localhost bin]# mysql -h227.0.0.1 -P1234 -ubuck -phello
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.0.81-log
Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type help; or \h for help. Type \c to clear the current input statement.
mysql
如果工作接口可以進入了,就可以在 Windows 平臺下,使用 Navicat 來連接數據庫,填寫對應的 host,Port,用戶名,密碼就可以
4. 讀寫分離測試
這里測試讀寫分離需要使用到 Jmeter 了,它是 Java 寫第一套開源的壓力測試工具,因為這個比較方便。他有專門測試 MySQL 的模塊,需要使用 MySQL 的 JDBC 驅動 jar 包,配置很簡單,東西很好很強大很好用。
Jmeter 下載地址:
https://mirrors.tuna.tsinghua.edu.cn/apache//jmeter/binaries/apache-jmeter-5.1.1.zip
MySQL 的 JDBC 包 :
https://cdn.mysql.com//archives/mysql-connector-java-5.1/mysql-connector-java-5.1.44.zip
JAVA8
https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
下載后,分別都解壓開來,打開 Jmeter (在 bin 目錄下有個 jmeter.bat,雙擊它前,你的機器需要先安裝 JAVA8,只有這樣才可以運行),在測試計劃中,導入 JDBC 的 jar 包
配置 JDBC 的驅動,如下圖
名稱可以隨意填,URL、賬密這些按之前設置的來即可,如下圖
jdbc:mysql://192.168.56.117:1234/test
hello
配置完成后,進行測試
先創建一個組
添加測試的 JDBC REQUEST
先整一個查詢的測試
點擊執行之后,去服務器上面的主備庫觀察數據傳輸情況
sar -n DEV 1 10000 用這條命令
或者 iostat 也可以
主庫:(明顯是沒有數據傳輸(幾乎沒讀寫))
備庫:(明顯紅色框框看到有數據傳輸)
由此可見,數據讀是從備庫讀取的。
寫入數據也是一樣
在主庫
create database test;
create table sbtest (name varchar(9));
insert into sbtest values (Tom
insert into sbtest as select * from sbtest;
不停執行以下語句的循環插入
insert into sbtest as select * from sbtest;
有個上百萬行,可以開始測試了。
“MYSQL 主從和 ATLAS 讀寫分離的搭建”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注丸趣 TV 網站,丸趣 TV 小編將為大家輸出更多高質量的實用文章!