MySQL羣集技術在分佈式系統中爲MySQL數據提供了冗餘特性,加強了安全性,使得單個MySQL服務器故障不會對系統產生巨大的負面效應,系統的穩定性獲得保障。
MySQL羣集須要有一組計算機,每臺計算機的角色多是不同的。MySQL羣集中有三種節點:管理節點、數據節點和SQL節點。羣集中的某計算機多是某一種節點,也多是兩種或三種節點的集合。這三種節點只是在邏輯上的劃分,因此它們不必定和物理計算機是一一對應的關係。
管理節點(也能夠稱管理服務器)主要負責管理數據節點和SQL節點,還有羣集配置文件和羣集日誌文件。它監控其餘節點的工做狀態,可以啓動、關閉或重啓某個節點。其餘節點從管理節點檢索配置數據,當數據節點有新事件時就把事件信息發送給管理節點並寫入羣集日誌。
數據節點用於存儲數據。
SQL節點跟通常的MySQL服務器是同樣的,咱們能夠經過它進行SQL操做。
node
下圖中畫出了三種羣集節點及應用程序間的關係:mysql
二. 部署過程
linux
從上面的簡介可知,MySQL羣集中有三種節點:管理節點、數據節點和SQL節點;因此,若是要實現高可用冗餘集羣,至少須要6臺主機。sql
咱們這裏把數據節點和SQL節點放在同一臺主機上,使用舞臺主機,主機信息以下:數據庫
10.10.91.71 node1 # mgmd節點
10.10.91.72 node2 # sql和data節點
10.10.91.75 node3 # sql和data節點
10.10.91.77 node4 # mgmd節點
1. 初始化系統安全
每一個節點都操做bash
# systemctl disable firewalld # vi /etc/selinux/config SELINUX=disabled # hostnamectl set-hostname xxx # cd/usr/local/ # wget http://mirrors.sohu.com/mysql/MySQL-Cluster-7.5/mysql-cluster-gpl-7.5.5-linux-glibc2.5-x86_64.tar.gz # 可根據時間狀況下載,從其餘鏡像源或官方下載 # tar -zxf mysql-cluster-gpl-7.5.5-linux-glibc2.5-x86_64.tar.gz && mv mysql-cluster-gpl-7.5.5-linux-glibc2.5-x86_64.tar.gz /usr/local/mysql # cp /usr/local/mysql/bin/ndb_mgm* /usr/local/bin/ # chmod +x /usr/local/bin/ndb_mgm* # chmod +x /usr/local/mysql/bin/ # echo "export PATH=$PATH:/usr/local/mysql/bin/" >> /etc/profile # reboot
2. 在node1和node4上配置管理節點
服務器
# mkdir /var/lib/mysql-cluster # vi /var/lib/mysql-cluster/config.ini
node1socket
[ndbd default] NoOfReplicas=2 DataMemory=512M IndexMemory=18M [ndb_mgmd] NodeId=1 HostName=10.10.91.71 DataDir=/var/lib/mysql-cluster [ndb_mgmd] NodeId=6 HostName=10.10.91.77 DataDir=/var/lib/mysql-cluster [ndbd] NodeId=2 HostName=10.10.91.72 DataDir=/usr/local/mysql/data [ndbd] NodeId=3 HostName=10.10.91.75 DataDir=/usr/local/mysql/data [mysqld] NodeId=4 HostName=10.10.91.72 [mysqld] NodeId=5 HostName=10.10.91.75
node4分佈式
[ndbd default] NoOfReplicas=2 DataMemory=512M IndexMemory=18M [ndb_mgmd] NodeId=6 HostName=10.10.91.77 DataDir=/var/lib/mysql-cluster [ndb_mgmd] NodeId=1 HostName=10.10.91.71 DataDir=/var/lib/mysql-cluster [ndbd] NodeId=2 HostName=10.10.91.72 DataDir=/usr/local/mysql/data [ndbd] NodeId=3 HostName=10.10.91.75 DataDir=/usr/local/mysql/data [mysqld] NodeId=4 HostName=10.10.91.72 [mysqld] NodeId=5 HostName=10.10.91.75
3. 在node2/node3上配置數據節點和sql節點
# groupadd mysql && useradd -g mysql mysql # vi /etc/my.cnf
node2
[client] socket=/usr/local/mysql/mysql.sock [mysqld] basedir=/usr/local/mysql datadir=/usr/local/mysql/data socket=/usr/local/mysql/mysql.sock user=mysql symbolic-links=0 ndbcluster ndb-connectstring=10.10.91.71,10.10.91.77 [mysqld_safe] log-error=/var/log/mysqld.log pid-file=/var/run/mysqld/mysqld.pid [mysql_cluster] ndb-connectstring=10.10.91.71,10.10.91.77
node3
[client] socket=/usr/local/mysql/mysql.sock [mysqld] basedir=/usr/local/mysql datadir=/usr/local/mysql/data socket=/usr/local/mysql/mysql.sock user=mysql symbolic-links=0 ndbcluster ndb-connectstring=10.10.91.71,10.10.91.77 [mysqld_safe] log-error=/var/log/mysqld.log pid-file=/usr/local/mysql/mysqld.pid [mysql_cluster] ndb-connectstring=10.10.91.71,10.10.91.77
# cd /usr/local/mysql # bin/mysql_install_db --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data # chown -R mysql.mysql /usr/local/mysql # cp mysql/support-files/mysql.server /etc/rc.d/init.d/ # chmod +x /etc/rc.d/init.d/mysql.server # chkconfig --add mysql.server
4. Mysql Cluster集羣的啓動
# 啓動管理節點,首次啓動須要+ --initial # ndb_mgmd -f /var/lib/mysql-cluster/config.ini --initial # 啓動數據節點,首次啓動須要+ --initial # /usr/local/mysql/bin/ndbd --initial # 啓動 SQL 節點 # /usr/local/mysql/bin/mysqld_safe --user=mysql &
# 查看集羣狀態
# 管理節點上操做:
[root@node1 local]# ndb_mgm -- NDB Cluster -- Management Client -- ndb_mgm> show Connected to Management Server at: localhost:1186 Cluster Configuration --------------------- [ndbd(NDB)] 2 node(s) id=2 @10.10.91.72 (mysql-5.7.17 ndb-7.5.5, Nodegroup: 0, *) # dbdb節點 id=3 @10.10.91.75 (mysql-5.7.17 ndb-7.5.5, Nodegroup: 0) [ndb_mgmd(MGM)] 2 node(s) id=1 @10.10.91.71 (mysql-5.7.17 ndb-7.5.5) # mgmd節點 id=6 @10.10.91.77 (mysql-5.7.17 ndb-7.5.5) [mysqld(API)] 2 node(s) id=4 @10.10.91.72 (mysql-5.7.17 ndb-7.5.5) # mysqld節點 id=5 @10.10.91.75 (mysql-5.7.17 ndb-7.5.5)
5. 測試
# 先將 SQL 節點的數據庫密碼修改成相同的
# /usr/local/mysql/bin/mysql_secure_installation # 該命令爲MySQL初始化命令操做 或使用以下方法修改密碼 mysql -u root -p; 隨機密碼(具體請參見/root/.mysql_secret文件獲取),進入後使用以下指令修改密碼: SET PASSWORD = PASSWORD('新密碼');
# SQL 節點 1 上新建庫,並插入數據
# mysql -uroot -p mysql> create database aa; mysql> use aa; mysql> create table student(id int(10) primary key auto_increment,name varchar(30),age tinyint(2)) engine=ndb; # 數據庫表的引擎必須爲NDB,否則就同步失敗了,能夠用 show create table 表名; 來查看引擎 mysql> insert into student (id,name,age) value(321281,"mzh",18); mysql> quit
# SQL 節點 2 查看是否同步
mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | aa | | mysql | | ndbinfo | | performance_schema | | sys | +--------------------+ 6 rows in set (0.00 sec) mysql> use aa; mysql> show tables; +--------------+ | Tables_in_aa | +--------------+ | student | +--------------+ 1 row in set (0.01 sec) mysql> select * from student; +--------+------+------+ | id | name | age | +--------+------+------+ | 321281 | mzh | 18 | +--------+------+------+ 1 row in set (4.27 sec) # 作到這裏,已經看到能夠同步了。而後咱們再模擬SQL節點1宕機了,在SQL2上插入新的數據,再SQL1開機,查看數據是否會同步。
# 在SQL 1上操做: # /etc/rc.d/init.d/mysql.server stop # ps -ef| grep mysql # 在 SQL 2 操做: mysql> insert into student (id,name,age) value(12121,"hp",19); mysql> select * from student; +--------+------+------+ | id | name | age | +--------+------+------+ | 12121 | hp | 19 | | 321281 | mzh | 18 | +--------+------+------+ 2 rows in set (0.00 sec) # 再在 SQL1 上查看是否同步 # /etc/rc.d/init.d/mysql.server start mysql> select * from student; +--------+------+------+ | id | name | age | +--------+------+------+ | 12121 | hp | 19 | | 321281 | mzh | 18 | +--------+------+------+ 2 rows in set (0.00 sec)
6. Mysql Cluster關閉和啓動
啓動mysql集羣。啓動順序爲:管理節點→數據節點→SQL節點。管理節點操做: # ndb_mgm -e shutdown # 關閉 # ndb_mgmd -f /var/lib/mysql-cluster/config.ini # 啓動 # /usr/local/mysql-cluster/ndb_mgm -e exit # 退出 # /usr/local/mysql-cluster/ndb_mgm -e show # 查看和管理 數據節點: # /usr/local/mysql/bin/ndbd # 啓動,數據節點和管理節點沒有啓動腳本,能夠本身手動編寫或將加到系統的起動機腳本中 SQL 節點操做: # /etc/rc.d/init.d/mysql.server stop/start/restart # chkconfig mysql.server # 添加到開機啓動