一:mysql集群原理:
1 mysql集群分为三个节点:
1.1 控制节点:本身不提供服务只是控制整个集群的开启与关闭
1.2 数据节点:真正提供数据库的存储,并和其他数据节点关联用
1.3 sql节点:和平常数据库一样提供正常服务
二:mysql集群要点与思路:
2.1 最好将现有的mysql或MariaDB卸载干净,
rpm -qa | grep mysql 找出含有mysql的软件包
rpm -e --nodeps mysql 删除后再查一下是否删除干净
2.2 关闭防火墙/selinux哦,不然后期同步数据节点同步会有问题
2.3 删除或移动掉/etc/my.cnf
3.1 几个重要的配置文件及文件作用
3.1.1 /var/lib/mysql-cluster/config.ini 此文件是控制节点的主配置文件,
主要是定义数据节点的数据目录的的路径
3.1.2 /etc/my.conf 主配置文件,主要指定集群是谁,以及存放数据目录及启动时生成的mysql.sock文件
4.错误排查思路
4.1 如果要迁移数据目录一定务必先将mysql关闭,否则mysql.sock文件会报错重复
4.2 查看my.cnf 文件中数据目录位置,并将其下的所有文件都复制到你想存放的位置,
并且要严格按照my.cnf 配置文件里面的位置进行更改,否则会报错类似如下
Starting MySQL...The server quit without updating PID file (/datas/mysqld//hadoop02.pid).
4.3 登录mysql集群报错,没有生成sock文件,mysql.sock 已经更换位置,所以找不到咯
4.4 ./ndb_mgmd初始化集群控制节点时报错如下:
-- Could not determine which nodeid to use for this node. Specify it with --ndb-nodeid=<nodeid
./ndb_mgmd -f /var/lib/mysql-cluster/config.ini #重新加载一下就好
mysql -uroot -p
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)
如果确认mysql服务正常运行,还提示文章标题的此错误,那就是“/etc/my.cnf”配置文件的问题了。
解决办法是修改“/etc/my.cnf”配置文件,在配置文件中添加“[client]”选项和“[mysql]”选项,
并使用这两个选项下的“socket”参数值,与“[mysqld]”选项下的“socket”参数值,指向的socket文件路径完全一致。如下:
[mysqld]
datadir=/storage/db/mysql
socket=/storage/db/mysql/mysql.sock
[client]
default-character-set=utf8
socket=/storage/db/mysql/mysql.sock
[mysql]
default-character-set=utf8
socket=/storage/db/mysql/mysql.sock
其中socket等于的路径就是socket文件的位置,我们只要修改my.cnf文件,告诉mysql,mysqldump
mysqladmin等命令,mysql服务的socket文件位置在哪里,然后重启mysqld服务即可。
5. mysql集群常用的命令及问题
5.1 控制节点:cd /usr/local/mysql/bin/
./ndb_mgmd -f /var/lib/mysql-cluster/config.ini --initial
#仅第一次启动或重启过服务器时又或config.ini 改过用,其它时候只需./ndb_mgmd即可
./ndb_mgm #进入集群客户端
show #查看集群有哪些节点及状态
shutdown #关闭集群
5.2 数据节点:
cd /usr/local/mysql/bin/
./ndbd #加载连接控制节点,一般在控制节点show看不到时执行此脚本
三:mysql搭建细节:
1、数据节点和SQL节点
第一步 添加mysql用户和组,这是必需的。
groupadd mysql
useradd -g mysql mysql
第二步 开始安装,下载的版本是免编译的,复制过来就可以用了。
cd /var/tmp
tar -C /usr/local-zxvf mysql-cluster-gpl-7.1.9a-linux-i686-glibc23.tar.gz
cd /usr/local
mv mysql-cluster-gpl-7.1.9a-linux-i686-glibc23.tar.gz mysql
第三步 在mysql修改目录权限,这也是必需的,不然第四步会报错的。
cd mysql
chown -R root .
chown -R mysql data
chgrp -R mysql .
第四步 安装初始的数据库表
scripts/mysql_install_db --user=mysql
安装完成后,初始化数据库报错如下:
[root@localhost mysql]# ./scripts/mysql_install_db --user=mysql
-bash: ./scripts/mysql_install_db: /usr/bin/perl: bad interpreter: No such file or
directory
貌似提示注释器错误,没有/usr/bin/perl文件或者档案,解决办法(安装perl跟perl-devel即可):
执行 yum -y install perl perl-devel
第五步 设置mysql服务为开机自启动
cp support-files/mysql.server /etc/rc.d/init.d/mysqld
chmod +x /etc/rc.d/init.d/mysqld
chkconfig --add mysqld
第六步 启动mysql服务,如果报错请参考
service mysqld start
这七步,其它的服务器添加按照如上步骤即可添加数据节点和SQL节点了
2 管理节点:
cd mysql
cp bin/ndb_mgm*/usr/local/bin
cd /usr/local/bin
chmod +x ndb_mgm*
管理节点只要ndb_mgm和ndb_mgmd两个文件和一个配置文件即可,因此把这三个文件复制到那里,那里就是管理节点了。
ndb_mgmd是mysql cluster管理服务器,ndb_mgm是客户端管理工具,等一下会用到它们的。
到目前为止两个SQL节点两个数据节点和一个管理节点都安装完成了,但是还不能工作,得进行配置,把这几个节点联系在一起协同工作。
3、配置
1、数据节点和SQL节点
mysql服务启动时会默认加载/etc/my.cnf作为其配置文件,要将一个mysql服务器配置成一个数据节点和SQL节点也非常的简单,这是配置前的my.cnf的内容:
[mysqld]
datadir=/home/mysql
socket=/home/mysql/mysql.sock
symbolic-links=0
[client]
default-character-set=utf8
socket=/home/mysql/mysql.sock
[mysql]
default-character-set=utf8
socket=/home/mysql/mysql.sock
[mysqld]
ndbcluster
ndb-connectstring=192.168.1.201
[mysql_cluster]
ndb-connectstring=192.168.1.201
只要在内容结尾加上4行就将这个mysql服务器变成了一个数据节点和SQL节点。
ndbcluster #运行NDB存储引擎
#指定管理节点 以上两行声明其为SQL节点
ndb-connectstring=192.168.1.252
[mysql_cluster]
#指定管理节点 以上两行声明其为数据节点
ndb-connectstring=192.168.1.252
注意两台服务器都得这样配置。
4、管理节点
管理节点的配置复杂一点,在管理服务器/var/lib/mysql-cluster/目录中创建config.ini文件。
cd /var/lib
mkdir mysql-cluster
cd mysql-cluster
vim config.ini
在config.ini文件中添加以下内容:
[NDBD DEFAULT]
NoOfReplicas=1 #每个数据节点的镜像数量
DataMemory=500M #每个数据节点中给数据分配的内存
IndexMemory=300M #每个数据节点中给索引分配的内存
[TCP DEFAULT]
portnumber=2202 #数据节点的默认连接端口
[NDB_MGMD] #配置管理节点
hostname=10.10.10.164
datadir=/var/lib/mysql-cluster/ #管理节点数据(日志)目录
[NDBD] #数据节点配置
hostname=10.10.10.164
datadir=/usr/local/mysql/data/ #数据节点目录
[NDBD]
hostname=10.10.10.165
datadir=/usr/local/mysql/data/
[MYSQLD] #SQL节点目录
hostname=10.10.10.165
[MYSQLD]
hostname=10.10.10.166
[NDBD DEFAULT]:表示每个数据节点的默认配置在每个节点的[NDBD]中不用再写这些选项,只能有一个。
[NDB_MGMD]:表示管理节点的配置,只有一个。
[NDBD]:表示每个数据节点的配置,可以有多个。
[MYSQLD]:表示SQL节点的配置,可以有多个,分别写上不同SQL节点的IP地址,也可以什么都不写,
只保留一个空节点,表示任意一个IP地址都可以进行访问,此节点的个数表明了可以用来连接数据节点的SQL节点总数。
四、启动
1、管理节点
mysql cluster 需要各个节点都 进行启动后才可以工作,节点的启动顺序为管理节点->数据节点->SQL节点。首先启动管理节点
cd /usr/local/bin
./ndb_mgmd -f /var/lib/mysql-cluster/config.ini
命令行中的ndb_mgmd是mysql cluster的管理服务器,后面的-f表示后面的参数是启动的参数配置文件。如果在启动后过了几天又添加了一个数据节点,这时修改了配置文件启动时就必须加上--initial参数,不然添加的节点不会作用在mysql cluster中。
./ndb_mgmd -f /var/lib/mysql-cluster/config.ini --initial
启动时可能会报个WARNING,如WARNING -- at line 7: [TCP] portnumber is deprecated,这个不用管。可以正常工作的。
2、数据节点
安装后第一次启动数据节点时要加上--initial参数,其它时候不要加,除非是在备份、恢复或配置变化后重启时。
/usr/local/mysql/bin/ndbd --initial
如果显示以下信息说明启动完成:
2010-12-31 12:48:03 [ndbd] INFO -- Angel connected to '192.168.1.252:1186'
2010-12-31 12:48:03 [ndbd] INFO -- Angel allocated nodeid: 3
3、SQL节点
service mysqld start
4、客户端管理
cd /usr/local/bin
./ndb_mgm
这时就进入到客户端,可以对mysql cluster进行各项操作,进入后会有ndb_mgm > 提示符出现,首先来查看各节点的连接情况,在ndb_mgm> 提示符下输入show:
ndb_mgm> show
ClusterConfiguration
---------------------
[ndbd(NDB)] 2 node(s)
id=2 @192.168.1.252 (mysql-5.1.51 ndb-7.1.9,Nodegroup:0,Master)
id=3 @192.168.1.52 (mysql-5.1.51 ndb-7.1.9,Nodegroup:1)
[ndb_mgmd(MGM)]1 node(s)
id=1 @192.168.1.252 (mysql-5.1.51 ndb-7.1.9)
[mysqld(API)] 2 node(s)
id=4 @192.168.1.252 (mysql-5.1.51 ndb-7.1.9)
id=5 @192.168.1.52 (mysql-5.1.51 ndb-7.1.9)
可以看到各个节点已经连接上了,至此,mysql cluster配置完成。
五、关闭
mysql cluster的关闭也很简单,只需在ndb_mgm> 提示符下输入 shutdown即可,这时会显示各节点的关闭信息,再输入exit即可退出ndb_mgm管理,回到shell中。虽然mysql cluster 关闭了,但是SQL节点的mysql服务并不会停止的。接下来就可以做各种试验了。
六、在数据节点创建库和表能够同步到另一台数据节点服务器上,且一台挂掉另一台可以正常提供服务
6.1 在一台数据节点上测试
[root@localhost mysql]# /etc/rc.d/init.d/mysqld status //检验mysql是否运行
[root@localhost mysql]# /etc/rc.d/init.d/mysqld start //启动mysql
[root@localhost mysql]# /usr/local/mysql/bin/mysql -u root -p
Enter password:
mysql> show databases;
mysql> create database testdb2;
mysql> use testdb2;
mysql> CREATE TABLE td_test2 (i INT) ENGINE=NDB;
//这里必须指定数据库表的引擎为NDBCLUSTER,与配置文件中的名称相同
mysql> INSERT INTO td_test2() VALUES (1);
mysql> INSERT INTO td_test2() VALUES (152);
mysql> SELECT * FROM td_test2;
6.2 在登录另一台数据节点查看,是否有创建的库和表,完成后再逆向测试(再这台上创建库再另一台数据节点查看是否有)
6.3 停掉一台数据节点,在没停 的数据节点上创建数据,然后在开启停掉的数据节点,应该能同步过来才算perfect