Linux CentOS-6.8 安装mysql集群
前言提示:公共配置需要在三台服务器上配置,管理节点在192.168.1.146上配置,数据节点需要在147,148上配置,sql节点需要在147,148上启动.详情如下文所示:
1.安装环境:Linux CentOS-6.8 64位2.Mysql集群版本:mysql-cluster-gpl-7.3.7-Linux-glibc2.5 64位
3.Mysql集群安装包下载链接: http://pan.baidu.com/s/1hsvHcf6提取密码:ek9s
本文将搭建一个最简化的MySQL Cluster系统,配置方法中的所有命令都是以root账户运行。这个MySQL Cluster包含一个管理结点,两个数据结点,两个SQL结点,这五个结点会分别安装在三个虚拟机上,虚拟机的名称和IP如下示:
一,公共配置
请在三台服务器(192.168.1.146,192.168.1.147,192.168.1.148)上分别配置此处的配置项
1.首先关闭三台服务器的防火墙
a)关闭防火墙:service iptables stop
2.查看并卸载自带的mysql
a)查看:rpm -qa | grep mysql
b)卸载:yum -y remove mysql-libs-5.1.73-7.el6.x86_64
3.解压mysql集群安装包
a)解压:tar -zxvf mysql-cluster-gpl-7.3.7-linux-glibc2.5-x86_64.tar.gz
b)移动解压的文件夹到/usr/local/mysql目录
i.mv mysql-cluster-gpl-7.3.7-linux-glibc2.5-x86_64 /usr/local/mysql
4.关闭SeLinux
a)编辑:vi /etc/selinux/config
将config文件中的SELINUX项改为disabled,修改后的config文件的内容如下:
修改如图标记的地方:SELINUX=disabled然后保存退出文件
b)保存退出
注意:以上就是三台服务器(146,147,148)都需要配置的,到这一步公共配置完成,接下来是每个节点的单独配置安装。一步一步来,少一步就可能导致安装mysql集群不成功。
二,配置管理结点(192.168.1.146)
1.配置config.ini配置文件
a)在shell中运行以下命令:(1.)mkdir /var/lib/mysql_cluster
(2.)cd /var/lib/mysql_cluster
(3.)vi config.ini
(4.)配置文件config.ini内容如下:
(5.)添加以下内容:
[NDBD DEFAULT] NoOfReplicas=1 DataMemory=500M IndexMemory=300M [TCP DEFAULT] #portnumber=2202 [NDB_MGMD] hostname=192.168.1.146 datadir=/var/lib/mysql_cluster/ [NDBD] hostname=192.168.1.147 datadir=/usr/local/mysql/data/ [NDBD] hostname=192.168.1.148 datadir=/usr/local/mysql/data/ [MYSQLD] hostname=192.168.1.147 [MYSQLD] hostname=192.168.1.148 |
(6.)按Esc:wq保存退出
2.安装管理节点
安装管理节点,不需要mysqld二进制文件,只需要MySQL Cluster服务端程序(ndb_mgmd)和监听客户端程序(ndb_mgm)
运行以下命令:
(1)cp /usr/local/mysql/bin/ndb_mgm* /usr/local/bin/(2)cd /usr/local/bin/
(3)chmod +x ndb_mgm*
a)启动:ndb_mgmd -f /var/lib/mysql_cluster/config.ini 下图表示启动成功
b)使用ndb_mgm监听客户端:ndb_mgm
下图表示管理节点已经启动成功,数据节点和SQL节点因为我们还没配置所以未启动
三,配置数据节点(192.168.1.147,192.168.1.148)
注意:以下配置两台服务器要完全一样
1.添加mysql组合用户
a)运行以下命令:
(1)groupadd mysql
(2)useradd -g mysql mysql
2.配置my.cnf配置文件
b)编辑:vi /etc/my.cnf 添加以下内容
c)配置文件my.cnf的内容如下:
[client] port=3306 socket=/usr/local/mysql/sock/mysql.sock [mysqld] basedir=/usr/local/mysql/ datadir=/usr/local/mysql/data/ socket=/usr/local/mysql/sock/mysql.sock user= mysql #log-error=/var/lib/mysql/mysqld.err ndbcluster ndb-connectstring=192.168.1.146 [mysql_cluster] ndb-connectstring=192.168.1.146 |
d)按Esc:wq保存退出
3.创建系统数据库
a)执行以下命令:
(1)cd /usr/local/mysql
(2)mkdir sock
(3)scripts/mysql_install_db --user=mysql --basedir=/usr/local/mysql --datadir=/usr /local/mysql/data
4.设置数据目录
a)执行以下命令,注意:点号一定不能少
(1)chown -R root .
(2)chown -R mysql.mysql /usr/local/mysql/data
(3)chown -R mysql.mysql /usr/local/mysql/sock
(4)chgrp -R mysql .
5.配置Mysql服务
运行以下命令:
(1)cp support-files/mysql.server /etc/rc.d/init.d/
(2)chmod +x /etc/rc.d/init.d/mysql.server
(3)chkconfig --add mysql.server
6.启动数据节点
首次启动,则需要添加--initial参数,以便进行NDB节点的初始化工作。在以后的启动过程中,则是不能添加该参数的,否则ndbd程序会清除在之前建立的所有用于恢复的数据文件和日志文件。
a)首次启动:/usr/local/mysql/bin/ndbd --initial(此方式会清楚所有数据文件和日志文件,不建议使用)
b)非首次启动:/usr/local/mysql/bin/ndbd(建议使用)
7.关闭数据节点
a)ps -ef | grep ndbd
b)kill -9 2382 2382(root用户执行才有权限)
8.管理节点查看:如下图所示
下图表示147,148两台服务器数据节点配置成功
四,启动SQL节点(192.168.1.147,192.168.1.148)
注意:因为SQL节点和数据节点在同一个虚拟机上,所以数据节点配置完成SQL节点也就配置完成了,只需要启动SQL节点
1.启动SQL节点:(以下两种方式都可以)
a)启动:/etc/init.d/mysql.server start(有时候显示成功,可能并没有启动成功,去管理节点查看是否成功,以管理节点显示为准)
b)重启:/etc/init.d/mysql.server restart(如果上面的命令启动不成功,那么就使用这条命令,可以会出现如下图所示错误,按照下面的解决方法即可)
c)出现下图则表示启动失败
2.解决办法:依次输入以下命令
原文:http://blog.sina.com.cn/s/blog_637e04c9010117ri.html
(1)cd /usr/local/mysql
(2)chown -R mysql.mysql .
(3)su - mysql
(4)cd /usr/local/mysql
(5)scripts/mysql_install_db
3.然后再输入/etc/rc.d/init.d/mysql.server restart 重启数据库即可
4.下图表示管理节点,数据节点,SQL节点开启成功
五,Mysql_cluster环境启动
注意启动顺序:首先是管理节点,然后是数据节点,最后是SQL节点。
1.启动管理节点:启动:ndb_mgmd -f /var/lib/mysql_cluster/config.ini
b)监听客户端:ndb_mgm
2.启动数据节点:
首次启动,则需要添加--initial参数,以便进行NDB节点的初始化工作。在以后的启动过程中,则是不能添加该参数的,否则ndbd程序会清除在之前建立的所有用于恢复的数据文件和日志文件。
a)初始化启动:/usr/local/mysql/bin/ndbd --initial(会清除数据文件和日志文件,如果不是首次启动不建议使用此种方法)
b)启动:/usr/local/mysql/bin/ndbd(建议使用)
3.启动SQL节点:
a)启动:/etc/init.d/mysql.server start(如果出现错误请参照步骤四的解决方法)
六,集群测试
测试一
现在我们在其中一个SQL结点上进行相关数据库的创建,然后到另外一个SQL结点上看看数据是否同步。
在SQL结点1(192.168.1.147)上执行:
1./usr/local/mysql/bin/mysql -u root -p 数据库登录(无密码回车即可)
2.显示所有数据库:show databases;
3.创建数据库aa:create database aa;
4.使用数据库aa:use
aa;
5.create Table test (id int) engine = ndb;
创建表并指定数据库表的引擎为NDB,这里必须要指定引擎为ndb否则同步失败
6.插入数据:insert into test (id)values (1);
7.查询:select *
from test;
然后在SQL结点2(192.168.1.148)上看数据是否同步过来了
1.登陆:/usr/local/mysql/bin/mysql -u root -p
2.显示数据库:show databases;
3.使用数据库:use aa;
4.查看数据:select * from test;
经过测试,在非master上创建数据,可以同步到master上
5.查看表的引擎是不是NDB:show
create table test;
2. 测试二
关闭一个SQL节点 (147节点),在另外一个节点(148节点)输入,然后再开启关闭的节点(147节点),看数据是否同步过来。
在SQL结点(192.168.1.148)上操作如下:
1.登录:/usr/local/mysql/bin/mysql -u root -p
2.创建数据库:create database cc;
3.使用数据库:use cc;
4.创建表test并指定引擎:create table test(id int) engine = ndb;
5.插入数据:insert into test(id)values(333);
6.查询数据:select * from test;
开启147节点,在SQL结点(192.168.1.147)上操作如下:
1.启动:/etc/rc.d/init.d/mysql.server restart (如果出现错误,在上面步骤四有解决方法)
2.登录:/usr/local/mysql/bin/mysql -u root -p
3.显示数据库:show databases;
4.使用数据库:use cc;
5.查询表:select * from test;
如下图所示数据已经同步了
七,修改密码
1.登录:/usr/local/mysql/bin/mysql -u root -p(无密码回车即可)
2.显示数据库:show databases;
1.使用mysql数据库:use mysql;
2.修改密码:update user set Password=password("root") where user='root';
5.刷新生效:flush privileges;
6.再次登录就需要密码了
八,Navicat for MySQL远程连接mysql
说明:在执行下面步骤之前,工具应该连接不上,用户没有权限,下面就介绍两种方法,修改权限允许用户连接
注意:连接之前一定要关闭虚拟机防火墙
方法1:
(1)登录数据库:/usr/local/mysql/bin/mysql -u root -p
(2)使用数据库:use mysql;
(3)授权法:GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'root' WITH GRANT OPTION;
(4)刷新生效:flush privileges;
(5)修改之后就可以连接了,如下图所示
方法2:
(1)先使用ssh通道连接虚拟机,不用点击确定,只需要用户名和密码正确
(2)再使用常规连接
为什么主机名是localhost呢,因为上面使用了ssh通道连上虚拟机之后localhost就相当于192.168.1.48,如果不使用ssh通道连接虚拟机的话那么localhost就相当于本机ip而不是虚拟机的ip
(3)连接之后查看用户,下图所示只允许了localhost连接所以192.168.1.48连接不上
(4)添加新用户允许所有ip连接,并赋权限
九,关闭集群
1.然后关闭Sql节点(147,148),分别在2个节点里运行:
a)关闭:/etc/init.d/mysql.server stop
b)启动:/etc/init.d/mysql.server start
c)重启:/etc/init.d/mysql.server restart
d)重新加载mysql:/etc/init.d/mysql.server reload
2.关闭管理节点和数据节点,只需要在管理节点中执行:
a)关闭:/usr/local/mysql/bin/ndb_mgm -e shutdown
十,java连接mysql集群
package conn;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
/**
* 连接mysql集群
*
* @author Liucong
*
* @时间:2017年6月12日下午7:47:59
*/
public class MysqlClusterConn {
public static void main(String[] args) {
MysqlClusterConn mysqlClusterConn = new MysqlClusterConn();
mysqlClusterConn.getCon();
// mysqlClusterConn.insert();
// mysqlClusterConn.delete();
// mysqlClusterConn.update();
mysqlClusterConn.select();
}
/**
* 链接数据库
*
* @return conn 连接对象
*/
private Connection getCon() {
Connection conn = null;
try {
// 加载驱动
Class.forName("com.mysql.jdbc.Driver");
// 连接集群关键字loadbalance
conn = (Connection) DriverManager
.getConnection("jdbc:mysql:loadbalance://192.168.1.47:3306,192.168.1.48:3306/test", "root", "root");
} catch (Exception e) {
e.printStackTrace();
}
return conn;
}
/**
* 关闭所有连接
*
* @param conn
* @param ps
* @param st
* @param rs
*/
private void closeAll(Connection conn, PreparedStatement ps, Statement st, ResultSet rs) {
try {
// 当连接不等于空的时候关闭
if (null != conn) {
conn.close();
}
if (null != ps) {
ps.close();
}
if (null != st) {
st.close();
}
if (null != rs) {
rs.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 添加数据
*/
private void insert() {
try {
Connection conn = getCon();
String sql = "insert into test(id,name)values(111,'aa');";
// 通过数据库连接加载指定的SQL语句,预编译sql,一般会使用预编译sql,比较安全
PreparedStatement ps = (PreparedStatement) conn.prepareStatement(sql); // 执行sql
ps.executeUpdate();
// Statement st = (Statement) conn.createStatement();
// 非预编译sql不推荐使用
// st.executeUpdate(sql);
System.out.println("添加成功。");
closeAll(conn, ps, null, null);// 关闭连接
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 查询数据
*/
protected void select() {
try {
Connection conn = getCon();// 连接数据库
String sql = "select * from test";
PreparedStatement ps = (PreparedStatement) conn.prepareStatement(sql);
ps.executeQuery();// 执行查询
ResultSet rs = ps.getResultSet();
while (rs.next()) {
System.out.println("id:" + rs.getInt("id") + " name:" + rs.getString("name"));
}
closeAll(conn, ps, null, rs);// 关闭连接
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 删除数据
*/
private void delete() {
try {
Connection conn = getCon();
String sql = "delete from test where id = 110;";
PreparedStatement ps = (PreparedStatement) conn.prepareStatement(sql);
ps.executeUpdate();// 执行删除
System.out.println("删除成功。");
closeAll(conn, ps, null, null);// 关闭连接
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 修改数据
*
* @param conn
*/
private void update() {
try {
Connection conn = getCon();
String sql = "update test set name = ? where id =?";
PreparedStatement ps = (PreparedStatement) conn.prepareStatement(sql);
ps.setString(1, "admin");// 设值
ps.setInt(2, 111);
ps.executeUpdate();// 执行修改
System.out.println("修改成功");
closeAll(conn, ps, null, null);// 关闭连接
} catch (Exception e) {
e.printStackTrace();
}
}
}
——————————————————————————————————————————————————————————————————————————————
上一篇: Docker实战-从入门到跑路
下一篇: MySQL数据库基础-学习认识