參考:http://www.cnblogs.com/linkstar/p/6510713.htmlhtml
若是沒有特殊聲明,則全部命令都在node1上執行node
192.168.1.201 node1 1核/448M 管理節點
192.168.1.202 node2 1核/448M 數據節點和mysql節點在同一臺機器上
192.168.1.203 node3 1核/448M 數據節點和mysql節點在同一臺機器上mysql
#架構圖及說明linux
前期準備
#配置主機名和IP對應關係(全部節點上操做該步)
[root@node1 ~]# vim /etc/hosts
192.168.1.201 node1
192.168.1.202 node2
192.168.1.203 node3sql
#在node1上生成祕鑰並分發到各節點
[root@node1 ~]# ssh-keygen -t rsa
[root@node1 ~]# cat .ssh/id_rsa.pub >>.ssh/authorized_keys數據庫
[root@node1 ~]# ssh-copy-id root@node2
[root@node1 ~]# ssh-copy-id root@node3vim
#作跳板機
[root@node1 ~]# alias a='for a in {1..3};do'
[root@node1 ~]# alias b='for b in {2..3};do'
#測試跳板機
[root@node1 ~]# a ssh node$a 'hostname';done
#注:若是出現解析的出來的IP和主機名不對應的問題,就看下.ssh/known_hosts中的對應關係,將錯誤的刪除便可服務器
#關閉各節點防火牆
[root@node1 ~]# a ssh node$a 'systemctl stop firewalld';done
[root@node1 ~]# a ssh node$a 'systemctl disable firewalld';done
[root@node1 ~]# a ssh node$a 'iptables -F';done架構
#安裝配置管理節點ssh
[root@node1 ~]# wget https://cdn.mysql.com//archives/mysql-cluster-gpl-7.5/mysql-cluster-gpl-7.5.11-linux-glibc2.12-x86_64.tar.gz
注:這裏的包地址是wget時跟隨的新地址,原地址爲https://dev.mysql.com/*****
[root@node1 ~]# tar -zxvf mysql-cluster-gpl-7.5.11-linux-glibc2.12-x86_64.tar.gz -C /usr/local/
[root@node1 ~]# cp /usr/local/mysql-cluster-gpl-7.5.11-linux-glibc2.12-x86_64/bin/ndb_mgm* /usr/local/bin/
[root@node1 ~]# mkdir /var/lib/mysql-cluster
[root@node1 ~]# mkdir /usr/local/mysql
[root@node1 ~]# vim /var/lib/mysql-cluster/config.ini
[ndbd default]
NoOfReplicas=2
DataMemory=512M
IndexMemory=18M
[ndb_mgmd]
HostName=192.168.1.201
DataDir=/var/lib/mysql-cluster
[ndbd]
HostName=192.168.1.202
DataDir=/var/lib/mysql-cluster
[ndbd]
HostName=192.168.1.203
DataDir=/var/lib/mysql-cluster
[mysqld]
[mysqld]
#使用配置文件初始化管理節點
[root@node1 ~]# ndb_mgmd -f /var/lib/mysql-cluster/config.ini
#使用ndb_mgm進行管理
[root@node1 ~]# ndb_mgm
ndb_mgm> show (使用show命令查看管理狀況,當數據節點配置完畢以後再用這個命令查看和管理)
#安裝配置數據節點 和 mysql節點
#如下的全部操做須要在全部的集羣節點都要進行相同的操做
[root@node1 ~]# scp mysql-cluster-gpl-7.5.11-linux-glibc2.12-x86_64.tar.gz root@node2:~
[root@node1 ~]# scp mysql-cluster-gpl-7.5.11-linux-glibc2.12-x86_64.tar.gz root@node3:~
[root@node1 ~]# b ssh node$b 'groupadd mysql';done
[root@node1 ~]# b ssh node$b 'useradd -g mysql -s /bin/false mysql';done
[root@node1 ~]# b ssh node$b 'mkdir /var/lib/mysql-cluster';done
[root@node1 ~]# b ssh node$b 'chown root:mysql /var/lib/mysql-cluster';done
[root@node1 ~]# b ssh node$b 'tar zxvf ~/mysql-cluster-gpl-7.5.11-linux-glibc2.12-x86_64.tar.gz -C /usr/local/';done
[root@node1 ~]# b ssh node$b 'cp -R /usr/local/mysql-cluster-gpl-7.5.11-linux-glibc2.12-x86_64/ /usr/local/mysql';done
[root@node1 ~]# b ssh node$b 'echo '[mysqld]'>>/etc/my.cnf';done
[root@node1 ~]# b ssh node$b 'echo 'ndbcluster'>>/etc/my.cnf';done
[root@node1 ~]# b ssh node$b 'echo 'ndb-connectstring=192.168.1.201'>>/etc/my.cnf';done
[root@node1 ~]# b ssh node$b 'echo ' '>>/etc/my.cnf';done
[root@node1 ~]# b ssh node$b 'echo '[mysql_cluster]'>>/etc/my.cnf';done
[root@node1 ~]# b ssh node$b 'echo 'ndb-connectstring=192.168.1.201'>>/etc/my.cnf';done
注:以上IP爲管理節點的IP
[root@node1 ~]# b ssh node$b '/usr/local/mysql/bin/mysqld --initialize';done 密碼樣式1: e,djt*Jre9vC 密碼樣式2: ew3;bg#B0Il6
[root@node1 ~]# b ssh node$b 'mv /etc/my.cnf{,.bak}';done
[root@node1 ~]# b ssh node$b 'chown -R root /usr/local/mysql';done
[root@node1 ~]# b ssh node$b 'chown -R mysql /usr/local/mysql/data';done
[root@node1 ~]# b ssh node$b 'chgrp -R mysql /usr/local/mysql';done
[root@node1 ~]# b ssh node$b 'cp /usr/local/mysql/support-files/mysql.server /etc/rc.d/init.d/';done
[root@node1 ~]# b ssh node$b 'chmod +x /etc/rc.d/init.d/mysql.server';done
[root@node1 ~]# b ssh node$b 'chkconfig --add mysql.server';done
#啓動ndbd
[root@node1 ~]# b ssh node$b '/usr/local/mysql/bin/ndbd --initial';done
#啓動MySQL
[root@node1 ~]# b ssh node$b '/etc/init.d/mysql.server start';done
Starting MySQL... SUCCESS!
Starting MySQL.. SUCCESS!
#登陸MySQL(除管理節點之外的全部節點上執行)
[root@node2 ~]# /usr/local/mysql/bin/mysql -uroot -p
Enter password:
mysql> set password=password('123456');
注:不執行該步會提示You must reset your password using ALTER USER statement before executing this statement.這樣的提示
mysql> alter user 'root'@'localhost' password expire never;
mysql> flush privileges;
#修改MySQL登陸密碼及受權
mysql> use mysql;
mysql> update user set host='%' where user='root';
mysql> update user set host='localhost' where user='root';
mysql> alter user 'root'@'localhost' identified by '123456';
mysql> update user set host='%' where user='root';
測試:
修改mysql密碼統一,修改mysql的訪問權限,使外部ip能遠程訪問mysql
而後在一臺上面建立數據庫,看另外一臺是否被同步,而後建立表,而後新增刪除等等。
惟一須要注意的是,建立表的時候必須選擇表的引擎爲NDBCLUSTER,不然表不會進行同步
若是把表引擎建立成MyISAM,再次查看數據同步狀況
SQL單點故障測試
NDB(數據節點)的單點故障
在這個測試環境中,數據節點是兩個,那麼他們對數據的存儲是互相鏡像仍是一份數據分紅幾塊存儲呢?(相似磁盤陣列RAID1仍是RAID0)
這個答案關鍵在於配置文件中 [NDBD DEFAULT] 組中的NoOfReplicas參數,
若是這個參數等於1,表示只有一份數據,可是分紅N塊分別存儲在N個數據節點上,
若是該值等於2,則表示數據被分紅N/2,每塊數據都有兩個備份,這樣即便有任意一個節點發生故障,只要它的備份節點正常,數據就能夠正常查詢。
測試方法和過程:
先將兩個數據節點之一中止,訪問zhangsan表,看可否正常訪問;
而後將NoOfReplicas配置改成2,這時數據節點實際上已經互爲鏡像,保存了兩份。
這時再中止任意一個數據節點,將不能再次訪問表zhangsan,反之
會報:
Error data: Illegal configuration change. Initial start needs to be performed when changing no of replicas (1 != 2) 的錯誤。
看來NoOfReplicas參數沒法臨時更改,因此一開始就須要設置好,不要到後面纔想到更改,那時就悲劇了。
若是從新ndbd --initial,將會丟失全部數據,記住這個坑.....
SQL節點關閉
/etc/init.d/mysqld stop
數據節點(NDB)關閉
ndbd stop
管理節點關閉
ndb_mgm> shutdown
總結:學習中踩了很多坑:好比參數NoOfReplicas沒法臨時更改,管理節點配置文件中若是很少預留一個[MySQLD],在中止NDB節點時會報錯,配置文件中的[NDBD]段落中的datadir指定的目錄在數據節點的服務器上面要存在。selinux,iptables等相關問題。後續的文章中將會介紹mysql cluster的平常維護,包括數據備份,數據恢復,日誌管理等。MySQL Cluster的核心在於NDB Cluster存儲引擎,不只對數據進行了水平切分,還對數據進行了跨節點冗餘。既解決了數據庫的擴展問題,同時也在很大程度上提升了數據庫總體可用性。