数据库的分布式和主从的区别
- 分布式
- 可以跨局域网部署。
- 只要有一个节点的写操作失败,则其他所有节点针对这一同步均会更新失败,以保证所有节点的数据一致性。
- mysql cluster的数据同步方式来讲是异步的。
- 主从
- 只能在局域网内部署。
- 主从复制的过程中,若从数据库中出现其中一条数据同步失败(即relay log中的语句有其中一条写操作语句执行失败),则后面的数据无法继续同步(relay log中后面的写操作语句无法继续执行下去),必须得解决掉或跳过这个执行失败的语句(需要人为去操作),这样就不能保证所有的从数据库的数据一致了。
- 主从之间是通过mysql的replication方式来保证数据的一致性。
环境说明
在虚拟机创建了三台虚拟服务器(一台管理节点,其余两台都是sql节点+数据节点)
- 186.186.1.218 (别名:tag1) (centos 7 64位)
- 186.186.1.215 (别名:tag2)(centos 7 64位)
- 186.186.1.188 (别名:tag3)(centos 7 64位)
下载 MySQL Cluster
安装MySQL Cluster
注意:在安装mysql cluster之前,必须得先检查该服务器上是否已安装了普通mysql,若安装了则需先把mysql删除干净,因为mysql cluster就包括了普通版mysql;
在安装管理节点、数据节点和sql节点时,最好以root用户登录执行,否则有一些步骤需要用到sudo命令来执行。
所有服务器均需执行执行以下操作。
上传到服务器目录/usr/softwares并解压(没有softwares文件自行创建)
tar -xzvf mysql-cluster-gpl-7.6.25-linux-glibc2.12-x86_64.tar.gz
将解压的文件重命名为mysql,并放到/usr/local/目录下
mv mysql-cluster-gpl-7.6.25-linux-glibc2.12-x86_64 /usr/local/mysql
配置安装管理节点
- 先在186.186.1.218服务器上配置
-
将文件ndb_mgm和ndb_mgmd拷贝到/usr/local/bin/目录下
- ndb_mgm,ndb客户端命令
- ndb_mgmd,ndb管理节点启动命令
- ndb_mgm是ndb_mgmd(MySQL Cluster Server)的客户端管理工具,通过它可以方便的检查Cluster的状态、启动备份、关闭Cluster等功能。
-
配置文件
创建数据库集群配置文件的目录
mkdir /var/lib/mysql-cluster
创建并编辑配置文件
vim /var/lib/mysql-cluster/config.ini
[ndbd default]
NoOfReplicas=1
DataMemory=200M
IndexMemory=64M
[ndb_mgmd]
NodeId=1
hostname=186.186.1.218
datadir=/var/lib/mysql-cluster/
[ndbd]
NodeId=2
hostname=186.186.1.215
datadir=/usr/local/mysql/data/
[ndbd]
NodeId=3
hostname=186.186.1.188
datadir=/usr/local/mysql/data/
[mysqld]
NodeId=4
hostname=186.186.1.215
[mysqld]
NodeId=5
hostname=186.186.1.188
- [NDBD DEFAULT]:表示每个数据节点的默认配置,在每个节点的[NDBD]中不用再写这些选项,只能有一个。
- NoOfReplicas:副本数量,数据节点数必须是副本数的整数倍。
- [NDB_MGMD]:表示管理节点的配置,只有一个,默认的对其他节点的端口是1186,故服务器需要开放1186端口。
- [NDBD]:表示每个数据节点的配置,可以有多个,分别写上不同数据节点的IP地址。
- [MYSQLD]:表示SQL节点的配置,可以有多个,分别写上不同SQL节点的IP地址。
- 启动管理节点
ndb_mgmd -f /var/lib/mysql-cluster/config.ini --initial
警告原因:IndexMemory 后续会针对各个ndbd进行配置,而不是统一配置了
- 检查是否正常启动 ndb_mgmd
ps -ef |grep ndb_mgmd
正常
分别在186.186.1.215,186.186.1.188 执行操作
- 注意,数据节点的端口开放问题,最好把防火墙关闭,虽然之前版本的默认端口号时2202,但是好像时5.1之后的端口号就没有限制(看哪个端口空闲就用哪个端口),即与sql节点通信的端口号会随机变换。若没有关闭防火墙,后面在管理节点查看集群状态的时候,可能会出现mysql节点老是连接不上的问题。
# 开启防火墙
systemctl start firewalld.service
# 防火墙开机启动
systemctl enable firewalld.service
# 关闭防火墙
systemctl stop firewalld.service
# 查看防火墙状态
firewall-cmd --state
- mysql服务启动时会默认加载/etc/my.cnf作为其配置文件,故需要修改/etc/my.cnf配置文件。
vi /etc/my.cnf
[mysqld]
datadir=/usr/local/mysql/data
basedir=/usr/local/mysql
character_set_server=utf8
ndbcluster
ndb-connectstring=186.186.1.218
default-storage-engine=ndbcluster
port=3306
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
[mysql_cluster]
ndb-connectstring=186.186.1.218
- 安装mysql数据库 (自带无需安装)
- 更改权限
#分别添加mysql组和mysql用户
groupadd mysql
useradd mysql -g mysql
#进入mysql目录
cd /usr/local/mysql/
#把mysql的目录设置成所有者为root
chown -R root .
#创建data目录,并把data目录设置所有者为mysql
mkdir data
chown -R mysql data
#把mysql的目录改成所属组为mysql
chgrp -R mysql .
- 执行安装脚本(执行结果图片,圈红的位置为 mysql 初始密码)
初始化数据库(这里要注意,如果你安装的版本和我的不同,数据库初始化的命令使不同的,很多之前的版本会使用:scripts/mysql_install_db --user=mysql来初始化,这个已经被mysql在新的版本中废弃了,所以需要使用下面的命令安装,如果你需要安装别的版本请参考mysql官网的对应版本的安装命令。)
- 执行安装脚本,初始化数据库
./bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql/ --datadir=/usr/local/mysql/data/
- 注意其中用户为mysql的名称需要跟配置文件my.cnf中的user=mysql相同
-
另外,这里一定要把--basedir=/usr/local/mysql/ --datadir=/usr/local/mysql/data/ 加上,否则会最后启动MySQL服务的时候会出现"table mysql.plugin doesn't exist","Can't open the mysql.plugin table. Please run mysql_upgrade to create it."错误,以及"PID"获取失败的错误
执行结果
- 设置mysql服务开机自启动
#加入到service服务
cp support-files/mysql.server /etc/init.d/mysqld
chmod +x /etc/init.d/mysqld
#加入到开机自启动列表
chkconfig --add mysqld
查询是否启动成功
chkconfig --list
- 修改数据库密码
#启动数据库
service mysqld start
#进入客户端
cd /usr/local/mysql/bin
./mysql -uroot -p
Enter password:这里输入之前的临时密码
#修改密码
mysql> set password=password('新密码');
#注意此密码必须要与其他服务器上的数据库设置的密码相同
- 启动数据节点
cd /usr/local/mysql
./bin/ndbd --initial
#非第一次启动,命令如下
./bin/ndbd
- 安装后第一次启动数据节点时要加上--initial参数。在以后的启动过程中,则是不能添加该参数的,否则ndbd程序会清除在之前建立的所有用于恢复的数据文件和日志文件。
配置安装sql节点(这里由于我是在tag2和tag3服务器 都是作为sql节点和数据节点,就没区分sql节点和数据节点配置)
- 正确my.cnf文件配置如下
- 数据节点
[mysqld]
datadir=/usr/local/mysql/data
basedir=/usr/local/mysql
character_set_server=utf8
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
[mysql_cluster]
ndb-connectstring=192.168.17.130:1186
- 数据节点启动方式和上述一致
- sql节点
[mysqld]
ndbcluster
datadir=/usr/local/mysql/data
basedir=/usr/local/mysql
character_set_server=utf8
default-storage-engine=ndbcluster
port=3306
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
[mysql_cluster]
ndb-connectstring=192.168.17.130:1186
- sql节点启动方式
service mysqld start
测试
- 在管理节点运行
ndb_mgm
ndb_mgm> show
测试数据
- 连接任何一个sql节点,在此sql节点上操作,创建数据库、创建表结构、增删改等操作,在其他的sql节点上也会同步这些操作,使数据保持一致。
- 登录tag2上的数据库
cd /usr/local/mysql
./bin/mysql -uroot -p
Enter password:输入密码
#创建数据库mytest
mysql> create database mytest;
#切换到mytest数据库
mysql> use mytest;
#创建表结构sys_myfirst
mysql> create table sys_myfirst(id varchar(36) primary key, name varchar(100), memo varchar(255));
#在sys_myfirst中添加几条数据
mysql> insert into sys_myfirst(id, name, memo) values('1','test1','hello world!');
mysql> insert into sys_myfirst(id, name, memo) values('2','test2','hello world haha!');
mysql> insert into sys_myfirst(id, name, memo) values('3','test3','hello world hehe!');
#查看数据
mysql> select * from sys_myfirst;
mysql> select * from sys_myfirst;
+----+-------+-------------------+
| id | name | memo |
+----+-------+-------------------+
| 1 | test1 | hello world! |
| 3 | test3 | hello world hehe! |
| 2 | test2 | hello world haha! |
+----+-------+-------------------+
3 rows in set (0.02 sec)
- 在节点tag3上查看数据
cd /usr/local/mysql
./bin/mysql -uroot -p
Enter password:输入密码
mysql> use mytest;
select * from sys_myfirst;
启动和停止集群
启动顺序:管理节点—数据节点—sql节点
停止顺序:管理节点(会同时停止管理节点和数据节点)—sql节点
以上是看网上的人都是这么说的,但是根据我的实践,其实sql节点可以一直保持启动状态(即使管理节点停止了也没关系,下次启动的时候会自动连接上此sql节点),只要第一次启动的时候遵循上面的顺序即可。
停止管理节点
停止管理节点的同时,会把其管理的所有数据节点也停止掉。
第一种方法:
ndb_mgm -e shutdown
第二种方法:
ndb_mgm
ndb_mgm> shutdown;
- 停止sql节点,其实就是停止mysql服务:
service mysqld stop