Linux構建MySQL集羣


MySQL集羣作用:解決MySQL代理服務器的缺點單點故障數據備份


結構圖如下:

wKiom1fyFs6gtx6XAACycUylU2U172.png

使用6臺RHEL6.4虛擬機,如圖所示sqlA和sqlB作爲SQL節點,ndbA和ndbB作爲數據節點,mgmd作爲管理節點,這5個節點構成MySQLCluster體系;而另一臺虛擬機192.168.4.120作爲MySQL測試客戶機。


角色說明:

客戶端(client)    :訪問集羣主機

管理集羣的主機(mgmd):管理集羣中所有主機,加載自己的主配置文件,設置集羣中所有主機的角色

SQL結點(sql)      :供用戶訪問和執行SQL語句,存儲表結構(2臺以上)

數據結點(ndbd節點)  :存儲表中的記錄(2臺以上)

 

MySQL集羣提供三進程:

mgmd    管理進程      運行在管理機上    config.ini

mysqld   數據庫服務     運行在sql節點上  /etc/my.cnf

ndbd   數據存儲服務   運行在ndbd節點   /etc/my.cnf

 

1、公共配置(要保留RHEL自帶的mysql-libs包)

A、關閉防火牆、停止自帶的mysql服務,移走配置文件/etc/my.cnf

 # service iptables stop;chkconfig iptables off

 # service mysql stop;chkconfig mysql off


B、卸載衝突的軟件包(所有節點)

 # rpm -qa | grep -i mysql       //查看原有的mysql包

 # yum -y remove .....


C、關閉selinux並重啓系統

 # setenforce 0;sed -ri 's/SELINUX=[a-z]+/SELINUX=disabled/' /etc/sysconfig/selinux

 # reboot


C、安裝集羣軟件(所有節點)

 # tar -xf MySQL-Cluster-gpl-7.3.3-1.el6.x86_64.rpm-bundle.tar 

 # rpm -Uvh MySQL-Cluster-*.rpm   //默認路徑/var/lib/mysql

 # rpm -qa | grep MySQL-Cluster

 

2、配置管理主機mgm

啓動管理進程時,調用配置文件cluster.ini,知道集羣中主機的角色(配置文件要自己編輯,不允許有空行

# mkdir -p /var/lib/mysql-cluster  //創建工作文件夾

# chown -R mysql: /var/lib/mysql-cluster

# vi /var/lib/mysql-cluster/cluster.ini                                        

[ndbd default]     //定義數據結點的公共配置                         

NoOfReplicas=2     //指定一份數據備份幾份(數據結點數或能被數據節點數整除)

DataMemory=80M      //數據內存(保存用戶執行過的SQL語句和查詢結果,通常是物理內存的1/3) 

IndexMemory=18M     //保存索引的內存                                 

[ndb_mgmd]                 //指定管理主機                           

nodeid=1                   //指定編號(管理標識),值不允許重複           

hostname=192.168.4.100         //管理主機的IP                            

datadir=/var/lib/mysql-cluster  //路徑在mgm上,用於存放集羣中主機的信息,路徑需自己創建 

[ndbd]                   //指定數據結點1             

nodeid =30                                                      

hostname=192.168.4.30            //數據結點的IP                         

Datadir=/var/lib/mysql/data  //路徑在數據結點上要存在,該目錄用於存放表中的記錄 

[ndbd]                      //指定數據結點2             

nodeid =40                                                      

hostname=192.168.4.40                                              

Datadir=/var/lib/mysql/data                                   

[mysqld]                        //指定sql結點1               

nodeid =10                                                      

hostname=192.168.4.10               //sql結點的IP                       

[mysqld]                        //指定sql結點2                  

nodeid =20                                                     

hostname=192.168.4.20 

                                                   

3、配置數據結點ndb(在 .30 .40上操作)

1)創建存儲表中記錄的目錄

  # mkdir -p /var/lib/mysql/data  

                     

2)編輯配置文件/etc/my.cnf(與mysqld的主配置文件同名)

 若原來已存在my.cnf文件,則先做改名

# mv /etc/my.cnf /etc/my.cnf.bak 

# vi /etc/my.cnf                                                 

[mysqld]                   //設置數據結點                         datadir=/var/lib/mysql/data     //將記錄存儲在本機的哪個目錄下,與管理主機上的設置一致 

ndb-connectstring=192.168.4.100   //管理主機的IP

ndbcluster                  //指定運行的存儲引擎        

[mysql_cluster]              //設置管理集羣的主機 

ndb-connectstring=192.168.4.100   //管理主機的IP                              

4、配置SQL結點sql (在.10  .20上操作)

1)編輯配置文件/etc/my.cnf

# mv /etc/my.cnf /etc/my.cnf.bak 

# vi /etc/my.cnf                                                   [mysqld]                      //設置sql結點                   

ndbcluster                    //指定表的存儲引擎               

default-storage-engine=ndbcluster                           

[mysql_cluster]                //設置管理集羣的主機
ndb-connectstring=192.168.4.100     //管理主機的IP                            

5、啓動(注意啓動順序)

*正確的啓動順序:管理節點 --> 數據節點 --> SQL節點。

*關閉順序:    SQL節點 --> 數據節點 --> 管理節點。

        

1)啓動管理進程

 # ndb_mgmd -f /var/lib/mysql-cluster/cluster.ini --nodaemon    //啓動管理進程腳本

 # pgrep mgmd          //查看進程是否開啓,可用pkill -9 mgmd 結束管理進程  

 # ndb_mgm            //執行登錄管理界面的腳本                        ndb_mgm>show        //查看集羣信息 

 # ndb_mgm -e shutdown    //關閉管理節點和數據節點                                              

 # netstat -atunp | grep ndb

 tcp   0  0 0.0.0.0:1186    0.0.0.0:*  LISTEN   4965/ndb_mgmd   


設置爲開機自啓動

#vim /etc/rc.local

ndb_mgmd -f /var/lib/mysql-cluster/cluster.ini  --nodaemon

 

關於管理節點的啓動,有以下幾個需要注意的地方:

ndb_mgmd 默認以後臺模式運行(--daemon),調試過程中可添加選項--nodaemon來禁用後臺模式;

ndb_mgmd 初次啓動成功以後,會自動保存集羣配置,以後再啓動時會忽略-f指定的配置文件,除非添加--inital選項(比如向集羣中添加新的節點時,就應該重新初始化)。

 

2)啓動數據結點進程

MySQL Cluster數據節點的對應服務程序爲ndbd(單線程的)、ndbmtd(多線程的),首次啓動或重新初始化時加 --initial選項,以後不用加。

 

# ndbd --initial-start      //啓動數據結點進程    

# pgrep ndbd             //查看進程,可用pkill -9 ndbd 結束管理進程           

# vim /etc/rc.local        //設置爲開機自啓動

 ndbd

                                                 

3)啓動sql結點的數據庫服務進程

 # pgrep mysqld

 # pkill -9 mysql

 # service mysql start

 # chkconfig mysql on 


 修改密碼

  # cat /root/.mysql_secret

  # the root user at Tue Dec24 15:24:50 2013 (local time): Z3Qw2OWJ  

  # mysql -u root -p Z3Qw2OWJ

  mysql> SET PASSWORD FOR 'root'@'localhost'=PASSWORD('123');


檢查sql節點默認存儲引擎,確保已支持ndbcluster且作爲默認存儲引擎:

# mysql -u root -p123456  //本機帳號登錄

mysql> show engines\G;

Engine: ndbcluster

Support: DEFAULT

 

管理節點查看集羣狀態

#ndb_mgm          //進入羣集管理環境

ndb_mgm> show         //若能看到如下信息就說明集羣創建成功

Cluster Configuration

---------------------

[ndbd(NDB)]  2node(s)

id=30 @192.168.4.30  (mysql-5.6.14 ndb-7.3.3, starting, Nodegroup:0)

id=40 @192.168.4.40  (mysql-5.6.14 ndb-7.3.3, Nodegroup: 0, *)

 

[ndb_mgmd(MGM)] 1 node(s)

id=1  @192.168.4.100  (mysql-5.6.14 ndb-7.3.3)

 

[mysqld(API)]   2node(s)

id=10 @192.168.4.10  (mysql-5.6.14 ndb-7.3.3)

id=20 @192.168.4.20  (mysql-5.6.14 ndb-7.3.3)

 

6、sql結點授權客戶端用戶(兩點節點都要)

mysql>grant all on *.* to root@'192.168.4.%' identified by '123';

 

7、MySQL集羣的高可用性測試(驗證集羣)

**如果默認引擎未設爲ndbcluster,則建表操作末尾需手工指定存儲引擎**

**不能自動切換兩個節點→mysql-mmm 解決**

        

1)數據同步(自動備份)測試

客戶端登錄 mysql節點.10 和.20 ( .10和.20的數據會同步)

# mysql -h192.168.4.10 -uroot -p123

mysql> create database ndb;

mysql> use ndb;

mysql> create table ndb01(idint);

mysql> insert into ndb01values(100);

mysql> select * from ndb01;

+------+

| id  |

+------+

| 100 |

| 100 |

從客戶機訪問20,確認結果(能看到從10上所建的庫、表、表記錄)

# mysql -h192.168.4.20 -uroot-p123

 

2)高可用性測試(單點故障)(關閉一臺數據節點)

**只要還有一臺數據節點可用,MYSQL數據庫整體就仍然可用**

關閉數據節點.30上的ndbd進程:

# pkill -9 ndbd

# netstat -antup | grep ndbd  //確認


ndb_mgm> show   //此時從管理節點上查看集羣狀態,會發現ndbA已斷開連接

id=30 (not connected, acceptingconnect from 192.168.4.30)


然後從客戶機訪問sqlA或sqlB,仍然可讀、寫數據庫。

 

驗證故障恢復過程

重新啓動.30上的ndbd服務進程,稍待片刻後強制關閉.40上的ndbd服務進程。然後再次訪問.30或.40節點,查詢ndb01表的記錄,發現與前面添加的結果一致:

以上測試成立說明:因故障中斷的數據節點(.30)恢復後,會立即從正常的數據節點(.40)同步數據,確保數據一致性。


3)高可用性測試(關閉一臺SQL節點)

這個比較好理解:當MySQL集羣內有多個SQL節點時,只要有一臺SQL節點可用,就可以通過它來訪問MySQL數據庫中保存的表數據。

比如說,關閉sqlA、sqlB中的任何一臺以後,還可以通過另外一臺來訪問mydb庫


完畢!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章