说明:cluster集群,数据节点上表的引擎一定要使用NDBCLUSTER!!!
主机1(管理节点1) :10.50.215.29 修改主机名称为:NGM01
主机2(管理节点2) :10.50.215.44 修改主机名称为:NGM02
主机3(数据节点1) :10.50.215.240 修改主机名称为:NDB01
主机4(数据节点2) :10.50.215.241 修改主机名称为:NDB02
主机5(mysql节点1):10.50.215.205 修改主机名称为:SQL01
主机6(mysql节点2):10.50.215.227 修改主机名称为:SQL02
说明:
多管理节点
当单一管理节点因某些原因宕机之后将会导致整个集群崩溃,因而引入多个管理节点,当某一个管理节点出现宕机之后,其他的管理节点自动接过MySQL集群的管理权限,保证集群的正常运行。
一、环境准备(请保持系统环境的干净,没有数据库服务和数据库的配置文件/目录等!!) ##--所有机器上的操作
保持干净的系统环境:
查看是否安装mysql:rpm -qa | grep mysql
普通删除:rpm -e mysql
强力删除:rpm -e --nodeps mysql
删除旧目录:rm -rf /etc/my.cnf
1:下载mysql cluster
官网下载地址:http://mirrors.sohu.com/mysql/MySQL-Cluster-7.5/
我这里下载的版本为:mysql-cluster-gpl-7.5.11-linux-glibc2.12-x86_64.tar.gz #文件有几十兆,下载时耐心等待
cd /usr/local;wget http://mirrors.sohu.com/mysql/MySQL-Cluster-7.5/mysql-cluster-gpl-7.5.11-linux-glibc2.12-x86_64.tar.gz
tar xvf mysql-cluster-gpl-7.5.11-linux-glibc2.12-x86_64.tar.gz
ln -s mysql-cluster-gpl-7.5.11-linux-glibc2.12-x86_64 mysql
关闭防火墙和selinux:systemctl stop iptables;systemctl stop firewalld;setenforce 0 #你也可以选择开放3306端口和同步需要使用的1186端口
新增用户组mysql和用户msyql
# groupadd -g 1001 mysql
# useradd -m -u 1001 -g mysql mysql
cd /usr/local;chown -R mysql.mysql mysql*
1.2:配置 /etc/hosts
10.50.215.29 NGM01
10.50.215.44 NGM02
10.50.215.240 NDB01
10.50.215.241 NDB02
10.50.215.205 SQL01
10.50.215.227 SQL02
二、安装配置管理节点 ##--一下操作全部在,主机1-2上操作
cd mysql-cluster-gpl-7.5.11-linux-glibc2.12-x86_64
cp bin/ndb_mgm* /usr/local/bin/;cd /usr/local/bin/;chmod +x ndb_mgm*
cp /usr/local/bin/ndb_mgmd /usr/bin/
新建配置文件并且初始化管理节点
mkdir -p /usr/local/mysql/cluster/mgr
chown -R mysql:mysql /usr/local/mysql/cluster
创建配置文件
vi /etc/config.ini
[ndbd default]
NoOfReplicas=2 #-可减少,#每一份数据被冗余存储在不同节点上的份数(如果是2则新增数据节点时不能增加1台,要每次增加两台,一般来说NoOfReplicas是2,那么数据节点增加或减少的数量也应该是成对的)
#mycluster 中没有参数设置节点组数. 节点组数=节点数/NoOfReplicas.
#所以你如果总共有两个数据节点,如果NoOfReplicas设为2, 那么意味着只有一个节点组. 如果NoOfReplicas=1,那么就有两个节点组
DataMemory=128M #--可增加,比以下配置的值大,#存储数据和主键索引的内存段大小,还会存放UNDO信息,默认值80M,使用情况由事务的大小和并发量决定
IndexMemory=64M #--可增加,比以上配置的值小,#存放索引(非主键)的内存段大小,默认值18M
ServerPort=2202
#优化项
#StopOnError=0
#StringMemory=5M
#MaxNoOfConcurrentTransactions=100000
#MaxNoOfConcurrentOperations=110000
#MaxNoOfLocalOperations=250000
#MaxNoOfConcurrentIndexOperations=81920
#MaxNoOfConcurrentScans=256
#MaxNoOfLocalScans=1000
#MaxNoOfOpenFiles=1000
#MaxNoOfAttributes=10000
#ODirect=1
#MaxNoOfTables=20320
#MaxNoOfOrderedIndexes=2048
#MaxNoOfUniqueHashIndexes=2048
DataDir=/usr/local/mysql/cluster/ndbd
[ndb_mgmd default]
DataDir=/usr/local/mysql/cluster/mgr
[ndb_mgmd]
NodeId=10
HostName=10.50.215.29 #--主机1的ip(管理节点1)
[ndb_mgmd]
NodeId=11
HostName=10.50.215.44 #--主机2的ip(管理节点2)
[ndbd]
NodeId=21
HostName=10.50.215.240 #--主机3的ip(数据节点1)
[ndbd]
NodeId=22
HostName=10.50.215.241 #--主机4的ip(数据节点2)
[mysqld]
NodeID=31
HostName=10.50.215.205 #--主机5的ip(mysql节点1)
[mysqld]
NodeID=32
HostName=10.50.215.227 #--主机6的ip(mysql节点2)
:wq
初始化管理节点并启动
[root@NGM01 bin]# ndb_mgmd -f /etc/config.ini --initial #首次启动加上 --initial
MySQL Cluster Management Server mysql-5.7.23 ndb-7.5.11 ###出现这个就可以使用ndb_mgm命令进去管理了--数据节点配置完毕之后再使用
2019-01-30 12:24:51 [MgmtSrvr] INFO -- The default config directory '/usr/local/mysql/mysql-cluster' does not exist. Trying to create it...
2019-01-30 12:24:51 [MgmtSrvr] INFO -- Sucessfully created config directory
查看集群状态:
[root@NGM02 bin]# ndb_mgm -e show
Connected to Management Server at: localhost:1186
Cluster Configuration
---------------------
[ndbd(NDB)] 2 node(s)
id=21 (not connected, accepting connect from 10.50.215.240)
id=22 (not connected, accepting connect from 10.50.215.241)
[ndb_mgmd(MGM)] 2 node(s)
id=10 @10.50.215.29 (mysql-5.7.23 ndb-7.5.11) #--管理节点ok
id=11 @10.50.215.44 (mysql-5.7.23 ndb-7.5.11) #--管理节点ok
[mysqld(API)] 2 node(s)
id=31 (not connected, accepting connect from 10.50.215.205)
id=32 (not connected, accepting connect from 10.50.215.227)
三、安装配置数据节点 ##以下操作全部在,主机3-4上操作
新建文件夹并赋予权限
mkdir -p /usr/local/mysql/cluster/ndbd
chown -R mysql:mysql /usr/local/mysql/cluster
配置数据节点,其他的内容先删除
vim /etc/my.cnf
[mysqld]
default_storage_engine=NDBCLUSTER #--这个很重要,不用这个引擎的话,数据不会同步!!或者创建表的时候CREATE TABLE student (age INT) ENGINE=NDBCLUSTER
ndb-connectstring=10.50.215.29,10.50.215.44 #--主机1-2(管理节点,如果有多个就用,号隔开)
[mysql_cluster]
ndb-connectstring=10.50.215.29,10.50.215.44 #--主机1-2(管理节点,如果有多个就用,号隔开)
:wq
启动数据节点:
创建启动命令:cp /usr/local/mysql/bin/ndbd /usr/bin/
主机2上的显示
[root@NDB01 bin]# ndbd --initial
2019-01-06 11:18:20 [ndbd] INFO -- Angel connected to '10.50.215.29:1186'
2019-01-06 11:18:20 [ndbd] INFO -- Angel allocated nodeid: 21
主机3上的显示
[root@NDB02 local]# ndbd --initial
2019-01-30 20:31:51 [ndbd] INFO -- Angel connected to '10.50.215.29:1186'
2019-01-30 20:31:51 [ndbd] INFO -- Angel allocated nodeid: 22
主机1-2上再次查看集群状态:
[root@NGM01 bin]# ndb_mgm -e show
Connected to Management Server at: localhost:1186
Cluster Configuration
---------------------
[ndbd(NDB)] 2 node(s)
id=21 @10.50.215.240 (mysql-5.7.23 ndb-7.5.11, Nodegroup: 0, *) #--数据节点ok
id=22 @10.50.215.241 (mysql-5.7.23 ndb-7.5.11, Nodegroup: 0) #--数据节点ok
[ndb_mgmd(MGM)] 2 node(s)
id=10 @10.50.215.29 (mysql-5.7.23 ndb-7.5.11) #--管理节点ok
id=11 @10.50.215.44 (mysql-5.7.23 ndb-7.5.11) #--管理节点ok
[mysqld(API)] 2 node(s)
id=31 (not connected, accepting connect from 10.50.215.205)
id=32 (not connected, accepting connect from 10.50.215.227)
四、配置mysql节点: ##以下操作全部在,主机5-6上操作 (root密码一定要相同!!)
创建目录
mkdir -p /usr/local/mysql/cluster/ndbd
chown -R mysql:mysql /usr/local/mysql/cluster
修改mysql的配置文件
vim /etc/my.cnf
[client]
socket=/usr/local/mysql/mysql.sock
[mysqld]
character-set-server=utf8
user=mysql
max_connections=1000
datadir=/usr/local/mysql/cluster/data
log_error=/usr/local/mysql/cluster/data/sql01.err #--自定义的名称
socket=/usr/local/mysql/mysql.sock
log-bin=mysql-bin
binlog_format=mixed
server_id=1001
ndbcluster #运行NDB存储引擎
ndb-connectstring=10.50.215.29,10.50.215.44 #--主机1-2(管理节点,如果有多个就用,号隔开)
[mysql_cluster]
ndb-connectstring=10.50.215.29,10.50.215.44 #--主机1-2(管理节点,如果有多个就用,号隔开)
:wq
数据库初始化
cd /usr/local/mysql/bin
./mysqld --basedir=/usr/local/mysql --datadir=/usr/local/mysql/cluster/data/ --user=mysql --initialize
more /usr/local/mysql/cluster/data/sql01.err
[root@SQL01 bin]# more /usr/local/mysql/cluster/data/sql01.err
2019-01-31T01:36:46.429768Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
2019-01-31T01:36:48.536450Z 0 [Warning] InnoDB: New log files created, LSN=45790
2019-01-31T01:36:48.726259Z 0 [Warning] InnoDB: Creating foreign key constraint system tables.
2019-01-31T01:36:48.795409Z 0 [Warning] No existing UUID has been found, so we assume that this is the first time that this server has been started. Generating a new UUID: ad3554cf-24f8-11e9-96c
3-000c2987e0f9.
2019-01-31T01:36:48.796767Z 0 [Warning] Gtid table is not ready to be used. Table 'mysql.gtid_executed' cannot be opened.
2019-01-31T01:36:48.798299Z 1 [Note] A temporary password is generated for root@localhost: 0Xy?4B1DTBC( *****记住这个随机密码
创建命令并启动mysql节点:
cd /usr/local/mysql/;cp support-files/mysql.server /etc/rc.d/init.d/
chmod +x /etc/rc.d/init.d/mysql.server;chkconfig --add mysql.server
[root@SQL01 mysql]# /etc/init.d/mysql.server start
Starting MySQL.. SUCCESS!
统一mysql节点的root用户的密码(主机5-6上,mysql节点上)
创建命令:cp /usr/local/mysql/bin/mysql /usr/bin/
使用随机密码进入数据库:[root@SQL02 mysql]# mysql -uroot -p
mysql> set password=password('123456');flush privileges;
Query OK, 0 rows affected, 1 warning (0.01 sec)
Query OK, 0 rows affected (0.00 sec)
再次查看集群状态 #主机1-2上
[root@NGM01 bin]# ndb_mgm -e show
Connected to Management Server at: localhost:1186
Cluster Configuration
---------------------
[ndbd(NDB)] 2 node(s)
id=21 @10.50.215.240 (mysql-5.7.23 ndb-7.5.11, Nodegroup: 0, *) #--数据节点ok
id=22 @10.50.215.241 (mysql-5.7.23 ndb-7.5.11, Nodegroup: 0) #--数据节点ok
[ndb_mgmd(MGM)] 2 node(s)
id=10 @10.50.215.29 (mysql-5.7.23 ndb-7.5.11) #--管理节点ok
id=11 @10.50.215.44 (mysql-5.7.23 ndb-7.5.11) #--管理节点ok
[mysqld(API)] 2 node(s)
id=31 @10.50.215.205 (mysql-5.7.23 ndb-7.5.11) #--sql节点ok
id=32 @10.50.215.227 (mysql-5.7.23 ndb-7.5.11) #--sql节点ok
测试数据同步是否正常:
登录mysql节点1:创建一个数据库
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| ndbinfo |
| performance_schema |
| sys |
+--------------------+
5 rows in set (0.00 sec)
mysql> create database test; --创建test库
Query OK, 1 row affected (0.08 sec)
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| ndbinfo |
| performance_schema |
| sys |
| test | --创建的test库
+--------------------+
6 rows in set (0.00 sec)
mysql>
再登录mysql节点2上,查看是否同步过来
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| ndbinfo |
| performance_schema |
| sys |
| test | --ok库test已同步过来
+--------------------+
6 rows in set (0.00 sec)
五、Cluster启动和关闭
**注意启动顺序
先启动所有的管理节点,然后所有数据节点、再所有SQL节点、最后看集群状态
1:启动管理节点:ndb_mgmd -f /etc/config.ini 或者 ndb_mgmd -f /etc/config.ini --reload;ndb_mgmd -f /etc/config.ini
##如果启动有报错就 ndb_mgm -e shutdown然后多启动几次
2:启动数据节点:ndbd
3:启动mysql节点:/etc/init.d/mysql.server start
**注意关闭顺序
先关闭所有的SQL节点,再关闭管理节点(数据节点会同时被关闭)pkill ndbd
1:关闭mysql节点:/etc/init.d/mysql.server stop
2:关闭管理节点:ndb_mgm -e shutdown 或者 pkill ndb_mgm ##停止管理节点不影响sql节点的正常访问,(数据节点会自动同时被关闭)pkill ndbd
使用:
外部访问msyql节点的ip(就跟平常正常访问mysql一样)
数据节点用于存储集群数据;系统会尽量将数据放在内存中,对内存要求大
cluster集群特点:
使用案例:方案较成熟,外国多家互联网公司使用
数据备份的实时性:实时同步,数据不会丢失
数据冗余:每个节点全冗余,没有分片
高可用性:使用HAProxy实现。由于实时同步,切换的可用性更高。
可伸缩性:扩展节点十分方便,启动节点时自动同步集群数据,100w数据(100M)只需20秒左右
负载均衡:使用HAProxy实现负载均衡
程序修改:程序无需修改
性能对比:跟直接操作mysql一样,直接用jdbc插入100条记录,大概600ms
缺点及限制:
对需要进行分片的表需要在mysql节点上修改引擎Innodb为NDB,不需要分片的可以不修改。NDB的事务隔离级别只支持Read Committed,即一个事务在提交前,查询不到在事务内所做的修改;而Innodb支持所有的事务隔离级别,默认使用Repeatable Read,不存在这个问题。外键支持:虽然最新的Cluster版本已经支持外键,但性能有问题(因为外键所关联的记录可能在别的分片节点中),所以建议去掉所有外键。Data Node节点数据会被尽量放在内存中,对内存要求大。
数据库系统提供了四种事务隔离级别:
A.Serializable(串行化):一个事务在执行过程中完全看不到其他事务对数据库所做的更新(事务执行的时候不允许别的事务并发执行。事务串行化执行,事务只能一个接着一个地执行,而不能并发执行。)。
B.Repeatable Read(可重复读):一个事务在执行过程中可以看到其他事务已经提交的新插入的记录,但是不能看到其他其他事务对已有记录的更新。
C.Read Commited(读已提交数据):一个事务在执行过程中可以看到其他事务已经提交的新插入的记录,而且能看到其他事务已经提交的对已有记录的更新。
D.Read Uncommitted(读未提交数据):一个事务在执行过程中可以看到其他事务没有提交的新插入的记录,而且能看到其他事务没有提交的对已有记录的更新。
优点:
真正的多主服务模式:多个服务能同时被读写,无延迟复制,不会产生数据丢失热备用:当某台服务器当机后,备用服务器会自动接管,不会产生任何当机时间自动扩展节点:新增服务器时,不需手工复制数据库到新的节点,支持InnoDB引擎
#####################优化项(可用可不用)##########################
sysctl.conf 优化:
cat>>/etc/sysctl.conf <<EOF
fs.aio-max-nr = 1048576
fs.file-max = 681574400
kernel.shmmax = 137438953472
kernel.shmmni = 4096
kernel.sem = 250 32000 100 200
net.ipv4.ip_local_port_range = 9000 65000
net.core.rmem_default = 262144
net.core.rmem_max = 4194304
net.core.wmem_default = 262144
net.core.wmem_max = 1048586
EOF
limit 优化:
cat>>/etc/security/limits.conf <<EOF
mysql soft nproc 65536
mysql hard nproc 65536
mysql soft nofile 65536
mysql hard nofile 65536
EOF
cat>>/etc/pam.d/login <<EOF
session required /lib/security/pam_limits.so
session required pam_limits.so
EOF
cat>>/etc/profile<<EOF
if [ $USER = "mysql" ]; then
ulimit -u 16384 -n 65536
fi
EOF
配置环境变量
vi /etc/profile
PATH=$PATH:$HOME/bin:/usr/local/mysql/bin
export MYSQL_PS1="(\u@\h:\p) [\d]>"
source /etc/profile
建议:
运行一个可行的集群至少需要三台计算机。但是,NDB群集中计算机的最低建议数量为4:每个运行管理和SQL节点一台,以及两台计算机充当数据节点。这两个数据节点的目的是提供冗余;管理节点必须在单独的机器上运行,以保证在其中一个数据节点出现故障的情况下继续仲裁服务。
为了提供更高的吞吐量和高可用性,您应该使用多个SQL节点(连接到集群的MySQL服务器)。运行多个管理服务器也有可能(尽管不是绝对必要)
节点组的疑问处:
ndb_mgm> show
Connected to Management Server at: localhost:1186
Cluster Configuration
---------------------
[ndbd(NDB)] 2 node(s)
id=21 @10.50.215.240 (mysql-5.7.23 ndb-7.5.11, Nodegroup: 0, *) ---疑问处
id=22 @10.50.215.241 (mysql-5.7.23 ndb-7.5.11, Nodegroup: 0)
[ndb_mgmd(MGM)] 2 node(s)
id=10 @10.50.215.29 (mysql-5.7.23 ndb-7.5.11)
id=11 @10.50.215.44 (mysql-5.7.23 ndb-7.5.11)
[mysqld(API)] 3 node(s)
id=31 @10.50.215.205 (mysql-5.7.23 ndb-7.5.11)
id=32 @10.50.215.227 (mysql-5.7.23 ndb-7.5.11)
id=33 @10.50.215.115 (mysql-5.7.23 ndb-7.5.11)
最简单的答案是,“这不是你可以控制的东西,除非你是编写或分析NDB集群源代码的软件工程师,否则你不需要担心任何事情。”
复杂点解释:
当一个节点充当这些机制中的“领导者”时,它通常是活动的协调点,其他节点充当“追随者”,按照领导者的指示执行其活动的部分内容。如果充当领导者的节点失败,则其余节点选出新的领导者。由老领导协调的正在进行的任务可能要么失败,要么由新领导继续进行,这取决于所涉及的实际机制
硬件要求:
1:数据节点和API节点,更快的CPU和更多内存可能会提高性能,而64位CPU可能比32位处理器更有效。在用于数据节点的机器上必须有足够的内存来保存每个节点的数据库份额
2:管理服务器的计算机,要求很低;一个普通的台式个人电脑(或相当的)通常就足以完成这项任务
详细了解此集群,推荐此站点:
https://blog.csdn.net/u014156250/article/details/80334858