欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Linux CentOS-6.8 安装mysql集群

程序员文章站 2024-03-21 18:24:10
...

前言提示:公共配置需要在三台服务器上配置,管理节点在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如下示:

Linux CentOS-6.8 安装mysql集群

一,公共配置

请在三台服务器(192.168.1.146,192.168.1.147,192.168.1.148)上分别配置此处的配置项

1.首先关闭三台服务器的防火墙

a)关闭防火墙:service iptables stop  Linux CentOS-6.8 安装mysql集群

2.查看并卸载自带的mysql

a)查看:rpm -qa | grep mysql

Linux CentOS-6.8 安装mysql集群

b)卸载:yum -y remove mysql-libs-5.1.73-7.el6.x86_64

Linux CentOS-6.8 安装mysql集群

3.解压mysql集群安装包

a)解压:tar -zxvf mysql-cluster-gpl-7.3.7-linux-glibc2.5-x86_64.tar.gz

Linux CentOS-6.8 安装mysql集群

b)移动解压的文件夹到/usr/local/mysql目录

i.mv mysql-cluster-gpl-7.3.7-linux-glibc2.5-x86_64 /usr/local/mysql

Linux CentOS-6.8 安装mysql集群

4.关闭SeLinux

a)编辑:vi /etc/selinux/config

config文件中的SELINUX项改为disabled,修改后的config文件的内容如下:

修改如图标记的地方:SELINUX=disabled然后保存退出文件

Linux CentOS-6.8 安装mysql集群

b)保存退出

Linux CentOS-6.8 安装mysql集群

注意:以上就是三台服务器(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

Linux CentOS-6.8 安装mysql集群

(4.)配置文件config.ini内容如下:

Linux CentOS-6.8 安装mysql集群

(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*Linux CentOS-6.8 安装mysql集群

3.启动管理节点

a)启动:ndb_mgmd -f /var/lib/mysql_cluster/config.ini 下图表示启动成功Linux CentOS-6.8 安装mysql集群

b)使用ndb_mgm监听客户端:ndb_mgm

下图表示管理节点已经启动成功,数据节点和SQL节点因为我们还没配置所以未启动Linux CentOS-6.8 安装mysql集群

三,配置数据节点(192.168.1.147,192.168.1.148)

注意:以下配置两台服务器要完全一样

1.添加mysql组合用户

a)运行以下命令:

(1)groupadd mysql
(2)useradd -g mysql mysql

Linux CentOS-6.8 安装mysql集群

2.配置my.cnf配置文件

b)编辑:vi /etc/my.cnf 添加以下内容

Linux CentOS-6.8 安装mysql集群

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/dataLinux CentOS-6.8 安装mysql集群

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 .

Linux CentOS-6.8 安装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
Linux CentOS-6.8 安装mysql集群

6.启动数据节点

首次启动,则需要添加--initial参数,以便进行NDB节点的初始化工作。在以后的启动过程中,则是不能添加该参数的,否则ndbd程序会清除在之前建立的所有用于恢复的数据文件和日志文件。

a)首次启动:/usr/local/mysql/bin/ndbd --initial(此方式会清楚所有数据文件和日志文件,不建议使用)

b)非首次启动:/usr/local/mysql/bin/ndbd(建议使用)

7.关闭数据节点

a)ps -ef | grep ndbdLinux CentOS-6.8 安装mysql集群

b)kill -9 2382 2382(root用户执行才有权限)

8.管理节点查看:如下图所示

下图表示147,148两台服务器数据节点配置成功Linux CentOS-6.8 安装mysql集群

四,启动SQL节点(192.168.1.147,192.168.1.148)

注意:因为SQL节点和数据节点在同一个虚拟机上,所以数据节点配置完成SQL节点也就配置完成了,只需要启动SQL节点

1.启动SQL节点:(以下两种方式都可以)

a)启动:/etc/init.d/mysql.server start(有时候显示成功,可能并没有启动成功,去管理节点查看是否成功,以管理节点显示为准)

Linux CentOS-6.8 安装mysql集群 

b)重启:/etc/init.d/mysql.server restart(如果上面的命令启动不成功,那么就使用这条命令,可以会出现如下图所示错误,按照下面的解决方法即可)

Linux CentOS-6.8 安装mysql集群   

c)出现下图表示启动失败

Linux CentOS-6.8 安装mysql集群

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_dbLinux CentOS-6.8 安装mysql集群 

3.然后再输入/etc/rc.d/init.d/mysql.server restart 重启数据库即可

Linux CentOS-6.8 安装mysql集群    

4.下图表示管理节点,数据节点,SQL节点开启成功

Linux CentOS-6.8 安装mysql集群  

五,Mysql_cluster环境启动

注意启动顺序:首先是管理节点,然后是数据节点,最后是SQL节点。

1.启动管理节点:

启动:ndb_mgmd -f /var/lib/mysql_cluster/config.iniLinux CentOS-6.8 安装mysql集群

b)监听客户端:ndb_mgm

Linux CentOS-6.8 安装mysql集群

2.启动数据节点:

首次启动,则需要添加--initial参数,以便进行NDB节点的初始化工作。在以后的启动过程中,则是不能添加该参数的,否则ndbd程序会清除在之前建立的所有用于恢复的数据文件和日志文件。

a)初始化启动:/usr/local/mysql/bin/ndbd --initial(会清除数据文件和日志文件,如果不是首次启动不建议使用此种方法)Linux CentOS-6.8 安装mysql集群

b)启动:/usr/local/mysql/bin/ndbd(建议使用)

Linux CentOS-6.8 安装mysql集群

3.启动SQL节点:

a)启动:/etc/init.d/mysql.server start(如果出现错误请参照步骤四的解决方法)Linux CentOS-6.8 安装mysql集群

六,集群测试

测试一

现在我们在其中一个SQL结点上进行相关数据库的创建,然后到另外一个SQL结点上看看数据是否同步。

SQL结点1(192.168.1.147)上执行:

1./usr/local/mysql/bin/mysql -u root -p 数据库登录(无密码回车即可)Linux CentOS-6.8 安装mysql集群
2.显示所有数据库:show databases;

Linux CentOS-6.8 安装mysql集群
3.创建数据库aa:create database aa;

4.使用数据库aa:use aa;

Linux CentOS-6.8 安装mysql集群

5.create Table test (id int) engine = ndb;

创建表并指定数据库表的引擎为NDB,这里必须要指定引擎为ndb否则同步失败

Linux CentOS-6.8 安装mysql集群
6.插入数据:insert into test (id)values (1);

7.查询:select * from test;

Linux CentOS-6.8 安装mysql集群

然后在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;

Linux CentOS-6.8 安装mysql集群

经过测试,在非master上创建数据,可以同步到master

5.查看表的引擎是不是NDB:show create table test;Linux CentOS-6.8 安装mysql集群

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;

Linux CentOS-6.8 安装mysql集群

开启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;

如下图所示数据已经同步了

Linux CentOS-6.8 安装mysql集群

七,修改密码

1.登录:/usr/local/mysql/bin/mysql -u root -p(无密码回车即可)

2.显示数据库:show databases;

Linux CentOS-6.8 安装mysql集群

1.使用mysql数据库:use mysql;

Linux CentOS-6.8 安装mysql集群 

2.修改密码:update user set Password=password("root") where user='root';

Linux CentOS-6.8 安装mysql集群 

5.刷新生效:flush privileges;

Linux CentOS-6.8 安装mysql集群

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;

Linux CentOS-6.8 安装mysql集群

(5)修改之后就可以连接了,如下图所示

Linux CentOS-6.8 安装mysql集群

方法2:

(1)先使用ssh通道连接虚拟机,不用点击确定,只需要用户名和密码正确

 Linux CentOS-6.8 安装mysql集群

(2)再使用常规连接

为什么主机名是localhost呢,因为上面使用了ssh通道连上虚拟机之后localhost就相当于192.168.1.48,如果不使用ssh通道连接虚拟机的话那么localhost就相当于本机ip而不是虚拟机的ip

 Linux CentOS-6.8 安装mysql集群

(3)连接之后查看用户,下图所示只允许了localhost连接所以192.168.1.48连接不上

Linux CentOS-6.8 安装mysql集群

(4)添加新用户允许所有ip连接,并赋权限

Linux CentOS-6.8 安装mysql集群

Linux CentOS-6.8 安装mysql集群

Linux CentOS-6.8 安装mysql集群

九,关闭集群

1.然后关闭Sql节点(147,148),分别在2个节点里运行:

a)关闭:/etc/init.d/mysql.server stop

Linux CentOS-6.8 安装mysql集群

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

Linux CentOS-6.8 安装mysql集群

十,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();
		}
	}
}
——————————————————————————————————————————————————————————————————————————————