赞
踩
数据库集群的形式:
主从复制
双主双从
集群实现读写分离和数据备份
执行流程:1.从库不断的试探主库二进制日志文件,如果这个文件有更新,则发送请求来获取主库中新的内容。 2.向主库写数据:包括添加 删 改 建 表等。
3.主将写的命令记录到二进制文件并更新二进制文件的偏移量。
4.如果从试探偏移量和从偏移量不同。则开启IO线程向主请求。
5.主根据偏移量,推送数据到从库中,并更新从库偏移量。
6.获取主数据后,写入日志文件,唤醒SQL线程。
7.sql线程根据记录偏移量,读取日志文件的命令
8.sql线程拿到命令,在本地数据库进行回收(就是在从库中执行主库的SQL语句)
注意:主从复制的过程会有延迟,基本没有影响
MySQL的cluster方案有很多官方和第三方的选择
高可用性:主服务器故障后可自动切换到后备服务器
可伸缩性:可方便通过脚本增加DB服务器
负载均衡:支持手动把某公司的数据请求切换到另外的服务器,可配置哪些公司的数据服务访问哪个服务器
mysql cluster架构图及说明
在实际中负载均衡服务还需要做备份,因为万一负载均衡服务器宕机将会导致所有数据节点都无法访问,所以需要对负载均衡服务器备份,有条件的话,分开管理节点和负载均衡器。
要搭建mysql的集群,首先就需要检查原系统是否有安装mysql,将原系统的mysql卸载后再安装mysql集群版。
下载介质
安装文件的获取有两个途径,一个是从mysql网站上获取,https://dev.mysql.com/downloads/cluster/7.5.html#downloads
如下图所示:
第二个途径是从镜像获取:
http://mirrors.sohu.com/mysql/MySQL-Cluster-7.5/
从这个url中找到符合自己操作系统的集群安装文件mysql-cluster-gpl-7.5.12-linux-glibc2.12-x86_64.tar.gz
我使用的目录是 /opt/mysql-cluster
tar -zxvf mysql-cluster-gpl-7.5.19-linux-glibc2.12-x86_64.tar.gz
#将解压的文件重命名为mysql,并放到/usr/local/目录下
mv mysql-cluster-gpl-7.5.19-linux-glibc2.12-x86_64/ /usr/local/mysql
假设每个节点计算机上都采用mysql用户来运行MySQL Cluster
groupadd mysql #首先添加mysql组
useradd mysql -g mysql #然后添加mysql用户
chown -R mysql.mysql /usr/local/mysql/ #改变目录的拥有者
官网安装配置指导:https://dev.mysql.com/doc/refman/5.7/en/mysql-cluster.html
注意,管理节点的防火墙端口开放,默认是1186
#将文件ndb_mgm和ndb_mgmd拷贝到/usr/local/bin/目录下
cp /usr/local/mysql/bin/ndb_mgm* /usr/local/bin/
//ndb_mgm,ndb客户端命令
//ndb_mgmd,ndb管理节点启动命令
//ndb_mgm是ndb_mgmd(MySQL Cluster Server)的客户端管理工具,
//通过它可以方便的检查Cluster的状态、启动备份、关闭Cluster等功能。
chmod +x ndb_mgm* #修改权限
配置文件
#创建数据库集群配置文件的目录 mkdir /var/lib/mysql-cluster #创建并编辑配置文件 vim /var/lib/mysql-cluster/config.ini [ndbd default] NoOfReplicas=2 # Number of replicas DataMemory=80M # How much memory to allocate for data storage IndexMemory=18M # How much memory to allocate for index storage [ndb_mgmd] NodeId=1 hostname=10.37.6.6 datadir=/var/lib/mysql-cluster/ [ndbd] NodeId=2 hostname=10.37.6.7 datadir=/usr/local/mysql/data/ [ndbd] NodeId=3 hostname=10.37.6.9 datadir=/usr/local/mysql/data/ [mysqld] hostname=10.37.6.7 [mysqld] hostname=10.37.6.9
启动管理节点
mkdir /usr/local/mysql/mysql-cluster #初始化提示需创建的文件
ndb_mgmd -f /var/lib/mysql-cluster/config.ini --initial
//ndb_mgmd是mysql cluster的管理服务器,后面的-f表示后面的参数是启动的参数配置文件。
//注意:如果在启动后过了几天又添加了一个数据节点,这时修改了配置文件启动时就必须加上--initial参数,
//不然添加的节点不会作用在mysql cluster中
关闭命令:/usr/local/bin/ndb_mgm -e shutdown
ndbd进去管理了
cd /usr/local/bin
ndb_mgm
ndb_mgm>show
分别在服务器10.37.6.7和10.37.6.9上执行以下操作。
注意,数据节点的端口开放问题,最好把防火墙关闭,虽然之前版本的默认端口号是2202,但是好像时5.1之后的端口号就没有限制(看哪个端口空闲就用哪个端口),即与sql节点通信的端口号会随机变换。若没有关闭防火墙,后面在管理节点查看集群状态的时候,可能会出现mysql节点老是连接不上的问题。
tar -zxvf mysql-cluster-gpl-7.5.19-linux-glibc2.12-x86_64.tar.gz
//将解压的文件重命名为mysql,并放到/usr/local/目录下
mv mysql-cluster-gpl-7.5.19-linux-glibc2.12-x86_64/ /usr/local/mysql
chown -R mysql.root /usr/local/mysql
配置my.cnf文件
mysql服务启动时会默认加载/etc/my.cnf作为其配置文件,故需要修改/etc/my.cnf
mv my.cnf my.cnf.bak
vim /etc/my.cnf
[mysqld]
datadir=/usr/local/mysql/data
basedir=/usr/local/mysql
character_set_server=utf8
ndbcluster
ndb-connectstring=10.37.6.6 //sql节点连接
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
[mysql_cluster]
ndb-connectstring=10.37.6.6 //ndb节点连接
安装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 .
执行安装脚本
初始化数据库(这里要注意,如果你安装的版本和我的不同,数据库初始化的命令使不同的,很多之前的版本会使用: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"获取失败的错误
10.37.6.7 D/dMD!rUC8=p #记录10.37.6.7的初始化密码
10.37.6.9 dyW(k*A._5i3 #记录10.37.6.9的初始化密码
设置mysql服务开机自启动
#加入到service服务
cp support-files/mysql.server /etc/init.d/mysqld
chmod +x /etc/init.d/mysqld
#加入到开机自启动列表 (本人未加入,因mysqlculster有启动顺序)
chkconfig --add mysqld
查询是否启动成功
chkconfig
修改数据库密码
#启动数据库
[root@localhost bin]# service mysqld start
#进入客户端
[root@localhost bin]# ./mysql -uroot -p
Enter password:这里输入之前的临时密码
#修改密码
mysql> set password=password('新密码');
#注意此密码必须要与其他服务器上的数据库设置的密码相同
注意 data目录的用户和用户组都是mysql,否则启动会异常。
启动数据节点
cd /usr/local/mysql
./bin/ndbd –initial
//非第一次启动,命令如下
./bin/ndbd
注意关闭管理节点防火墙:systemctl stop firewalld.service
如果出现下述现象就成功了
回到管理节点,使用上述说过的show查看,如下的类似显示,证明已经连接完成
启停:
启动mysql集群。启动顺序为:管理节点→数据节点→SQL节点。
注意关闭sql节点防火墙:systemctl stop firewalld.service
访问SQL节点。
管理节点启动命令:/usr/local/bin/ndb_mgmd -f /var/lib/mysql-cluster/config.ini //--initial
//改了配置文件启动时就必须加上--initial参数
关闭命令:/usr/local/bin/ndb_mgm -e shutdown //管理节点和数据节点
或ndb_mgm> shutdown
数据节点启动:/usr/local/mysql/bin/ndbd //--initial 数据初始化了
Mysql启动:service mysqld start
Mysql启动关闭:service mysqld stop
在其中一个节点(mysql节点上)创建数据库test_db,刷新一下navicat工具中的数据库连接,可以看到集群里数据库的信息都更新了.
CREATE TABLE IF NOT EXISTS `runoob_tbl`(
`runoob_id` INT UNSIGNED AUTO_INCREMENT,
`runoob_title` VARCHAR(100) NOT NULL,
`runoob_author` VARCHAR(40) NOT NULL,
`submission_date` DATE,
PRIMARY KEY ( `runoob_id` )
)ENGINE=NDBCLUSTER DEFAULT CHARSET=utf8;
注意建表的引擎需要用ENGINE=NDBCLUSTER;
遇到的问题
权限问题启动mysql报错
chown mysql:mysql -R mysq
service mysql start
启动数据库节点无法和管理节点相连
原因由于防火墙和selinux没有关闭
firewall-cmd --state
systemctl stop firewalld.service
设置root用户远程登录
GRANT ALL PRIVILEGES ON *.* TO root@'%' IDENTIFIED BY '123456' WITH GRANT OPTION;
或
use mysql
update user set host=’%’ where user=’root’ limit 1;
flush privileges;
配置两个管理节点时show报错Could not get configuration
两个管理节点同时都启动起来,才能看到状态
注意config.ini 修改了 管理节点启动必须加上–initial参数生效。而数据节点 --initial,则数据初始化了.
测试
1.10.37.6.26 中关闭管理节点 /usr/local/bin/ndb_mgm -e shutdown
则:10.37.6.6 管理节点中显示数据节点:node2,node 3关闭
10.37.6.7 10.37.6.9上的数据节点不能修改数据。
2.10.37.6.7 数据sql节点 service mysqld stop
10.37.6.9 数据节点上插入数据
INSERT INTO runoob (runoob_title,runoob_author,submission_date )VALUES ( 6, 6,'2020-09-02' );
恢复10.37.6.7 数据sql节点 service mysqld start
查看数据同步。
但10.37.6.9drop database test_db;
10.37.6.7恢复后不会drop database test_db;但会drop tables 了。而此时在10.37.6.7test_db建tables不会同步。当10.37.6.9上新建database test_db后会自动同步。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。