分布式系统(linux shell zookeeper)
Linux介绍
1 介绍
Linux操作系统是基于UNIX操作系统发展而来的一种克隆系统,它诞生于1991 年的 10 月5 日(这是第一次正式向外公布的时间)。
以后借助于Internet网络,并通过全世界各地计算机爱好者的共同努力,已成为今天世界上使用最多的一种UNIX 类操作系统,并且使用人数还在迅猛增长。
2 诞生
1991 年初,林纳斯·托瓦兹开始在一台386sx 兼容微机上学习minix 操作系统。通过学习,他逐渐不能满足于minix 系统的现有性能,并开始酝酿开发一个新的免费操作系统。
1991 年的10 月5 日,林纳斯·托瓦兹在comp.os.minix 新闻组上发布消息,正式向外宣布Linux 内核系统的诞生(Free minix-like kernel sources for 386-AT)。这段消息可以称为Linux 的诞生宣言,并且一直广为流传。
3 版本
主流的Linux发行版:Ubuntu, CentOS, Red Hat, DebianGNU/Linux ,Fedora,Gentoo,MandrivaLinux ,PCLinuxOS,SlackwareLinux ,openSUSE,ArchLinux,Puppylinux,Mint, 等。
大陆发行版:中标麒麟Linux(原中标普华Linux), 红旗Linux(Red-flag Linux) ,起点操作系统StartOS(原Ylmf OS),Qomo Linux(原Everest),冲浪Linux(Xteam Linux) ,蓝点Linux ,新华Linux ,共创Linux ,百资Linux,veket,lucky8k-veket.Open Desktop ,Hiweed GNU/Linux ,Magic Linux ,Engineering Computing GNU/Linux ,kylin,中软Linux,新华华镭Linux(RaysLX) ,CD Linux ,MC Linux,即时Linux(Thizlinux) ,b2d linux ,IBOX ,MCLOS,FANX,酷博linux,新氧Linux,Hiweed,Deepin Linux(深度linux)。
4 应用
全球大量数据中心的服务器已经基于 Linux Server 平台。相较 Windows Server 而言,Linux Server 提供了更多优势。包括 Google、Twitter、Facebook 和 Amazon 在内的诸多国际互联网巨头,都在基于 Linux Server 的服务器上运转他们的服务。
android是一种以Linux与JAVA为基础的开放源代码操作系统,主要使用于便携设备。Android操作系统最初由Andy Rubin开发,被谷歌收购后则由Google公司和开放手机联盟领导及开发,主要支持手机与平板。
5 特点
免费的开源操作系统
多任务、多用户,丰富的网络功能,可靠的系统安全,良好的可移植性,具有标准兼容性,良好的用户界面,出色的速度性能
6 CentOS
免费:RedHat 和CentOS差别不大,基于Red Hat Linux 提供的可自由使用源代码的企业CentOS版本。
主流:目前的Linux操作系统主要应用于生产环境,主流企业级Linux系统仍旧是RedHat或者CentOS。
更新方便:CentOS独有的yum命令支持在线升级,可以即时更新系统,不像RedHat 那样需要花钱购买支持服务!
7 Linux目录结构
bin (binaries)存放二进制可执行文件
sbin (super user binaries)存放二进制可执行文件,只有root才能访问
etc (etcetera)存放系统配置文件
usr (unix shared resources)用于存放共享的系统资源
home 存放用户文件的根目录
root 超级用户目录
dev (devices)用于存放设备文件
lib (library)存放跟文件系统中的程序运行所需要的共享库及内核模块
mnt (mount)系统管理员安装临时文件系统的安装点
boot 存放用于系统引导时使用的各种文件
tmp (temporary)用于存放各种临时文件
var (variable)用于存放运行时需要改变数据的文件
Linux 安装
1 准备软件
Windows7,8,10【腾出50g空间】
CentOS-6.7-x86_64-bin-DVD1.ISO 【安装盘】
CentOS-6.7-x86_64-bin-DVD2.ISO 【安装盘】
VMWare11-lite.rar【虚拟机软件】
SecureCRT_33lc【SSH操作软件】
下载地址:【找牛哥免费索取:qq-1325821989】
2 安装虚拟机软件
解压: VMWare11-lite.rar
点击安装。
3 NAT网络规划
4 安装linux虚拟机min1
- File-create new virtual Machine
- 选择Custom , next
- Next
- 选择 I will install the operatin system later , next
- 选择 linux,version(CentOS 64-bit) , next
- 输入:Name: min1, location: G:\Machines\min1 , next
- Cpu,core,选择1 个, next
- 选择内存1G , next
- 选择NAT网络,next
- 选择LSI Logic,next
- 选择SCSI,next
- 选择create a new virtual disk,next
- 输入20G,next
- 输入min1.vmdk,next
- 点击Finish
5 设置NAT网络
Vmware-Edit-virtual network editor
6 min1安装centos系统
6.1 Edit virtual machine setting
6.2 选择安装光盘
6.3 Power on 开始安装
6.4 进入安装界面,Ctrl-alt可以切换鼠标
6.5 选择skip
6.6 输入主机名min1
6.7 输入密码:hadoop
6.8 选择Mininal 安装
6.9 完成安装
Linux网卡配置
1 Min1上右键,power on 启动
2 登陆linux
用户 root
密码 hadoop
3 配置网卡
vi /etc/sysconfig/network-scripts/ifcfg-eth0
进行如下设置
ONBOOT=yes
BOOTPROTO=none
IPADDR=192.168.33.61
NETMASK=255.255.255.0
GATEWAY=192.168.33.1
DNS1=192.168.33.1
reboot
4 设置window的VMnet8网卡
5 在window里Ping通linux【192.168.33.61】,成功
(4) linux克隆
1 打开VMware, 在min1上右键-manage-clone
2 选择 create a full clone
3 输入min3,路径修改为g:\Machines\min3
4 点击完成
5 启动虚拟机min3,输入root/hadoop登录
6 网卡设置-min2-IPADDR=192.168.33.62
1:直接修改 vi /etc/sysconfig/network-scripts/ifcfg-eth0
2:删掉UUID HWADDR
3:设置ONBOOT=YES
4:配置静态地址:
BOOTPROTO=none
IPADDR=192.168.33.62
NETMASK=255.255.255.0
GATEWAY=192.168.33.1
DNS1=192.168.33.1
5:然后删除:
rm -rf /etc/udev/rules.d/70-persistent-net.rules
6:修改主机名:
cd /etc/sysconfig
vi network
NETWORKING=yes
HOSTNAME= min2
7:然后 reboot
7 网卡设置-min3-IPADDR=192.168.33.63
1:直接修改 vi /etc/sysconfig/network-scripts/ifcfg-eth0
2:删掉UUID HWADDR
3:设置ONBOOT=YES
4:配置静态地址:
BOOTPROTO=none
IPADDR=192.168.33.63
NETMASK=255.255.255.0
GATEWAY=192.168.33.1
DNS1=192.168.33.1
5:然后删除:
rm -rf /etc/udev/rules.d/70-persistent-net.rules
6:修改主机名:
cd /etc/sysconfig
vi network
NETWORKING=yes
HOSTNAME= min3
7:然后 reboot
(5)SecureCRT的使用
1 解压出securecrs_33lc
2 打开G:\soft\securecrs_33lc,启动SecureCRTPortable.exe
3 File-quick connect
4 输入ip:192.168.33.61,及账号root
5 点击确定,输入密码
6 点击ok,即可以进入SSH终端:
(6)linux的常用命令
1.1 日常操作命令
查看当前所在的工作目录
pwd
查看当前系统的时间
date
查看有谁在线(哪些人登陆到了服务器)
who 查看当前在线
last 查看最近的登陆历史记录
1.2 文件系统操作
查看文件
ls / 查看根目录下的子节点(文件夹和文件)信息
ls -al -a是显示隐藏文件 -l是以更详细的列表形式显示
ll 列表形式显示
ll -a 显示隐藏文件
切换目录
cd /home
创建文件夹
mkdir aaa 这是相对路径的写法
mkdir -p aaa/bbb/ccc 批量创建文件路径
mkdir /data 这是绝对路径的写法
删除文件夹
rmdir 可以删除空目录
rm -r aaa 可以把aaa整个文件夹及其中的所有子节点全部删除
rm -rf aaa 强制删除aaa
修改文件夹名称
mv aaa aa1
创建文件
touch fbb.txt 创建一个空文件
echo "hello fbb" > fbb.txt 利用重定向">"的功能,将一条指令的输出结果写入到一个文件中,会覆盖原文件内容
echo "hello , liu yi fei " >> lyf.txt 将一条指令的输出结果追加到一个文件中,不会覆盖原文件内容
1.3 文件权限的操作
linux文件权限的描述格式解读
drwxr-xr-x (也可以用二进制表示 111 101 101 --> 755)
d:标识节点类型(d:文件夹 -:文件 l:链接)
r:可读 w:可写 x:可执行
第一组rwx: 表示这个文件的拥有者对它的权限:可读可写可执行
第二组r-x: 表示这个文件的所属组对它的权限:可读,不可写,可执行
第三组r-x: 表示这个文件的其他用户(相对于上面两类用户)对它的权限:可读,不可写,可执行
修改文件权限
chmod g-rw fbb.txt 表示将fbb.txt对所属组的rw权限取消
chmod o-rw fbb.txt 表示将fbb.txt对其他人的rw权限取消
chmod u+x fbb.txt 表示将fbb.txt对所属用户的权限增加x
也可以用数字的方式来修改权限
chmod 664 fbb.txt
就会修改成 rw-rw-r- : 因为110110100=664
如果要将一个文件夹的所有内容权限统一修改,则可以-R参数
chmod -R 770 aaa/
chown将指定文件的拥有者改为指定的用户或组,用户可以是用户名或者用户ID;组可以是组名或者组ID
chown 用户名:组名
chown fbb:fbb aaa/ <只有root能执行>
注意:
目录没有执行权限的时候普通用户不能进入
文件只有读写权限的时候,只要父级目录有执行和修改的权限,普通用户是可以删除的。(删除文件不是修改它,是操作父目录),
1.4 基本的用户管理
添加用户
useradd fbb
要修改密码才能登陆
passwd fbb 按提示输入密码即可
为用户配置sudo权限
用root编辑 vi /etc/sudoers
在文件的如下位置,为fbb添加一行即可
root ALL=(ALL) ALL
fbb ALL=(ALL) ALL
然后,fbb用户就可以用sudo来执行系统级别的指令
[fbb@min1~]$ sudo useradd hadoop
1.5 系统管理操作
查看主机名
hostname
修改主机名(重启后无效)
hostname min1fbb
修改主机名(重启后永久生效)
vi /etc/sysconfig/network
修改IP(重启后无效)
ifconfig eth0 192.168.33.161
修改IP(重启后永久生效)
vi /etc/sysconfig/network-scripts/ifcfg-eth0
mount 挂载外部存储设备到文件系统中
mkdir /mnt/cdrom 创建一个目录,用来挂载
mount -t iso9660 -o ro /dev/cdrom /mnt/cdrom/ 将设备/dev/cdrom挂载到 挂载点 : /mnt/cdrom中
umount
umount /mnt/cdrom
统计文件或文件夹的大小
du -sh /mnt/cdrom/Packages
df -h 查看磁盘的空间
关机
halt
重启
reboot
1.6 配置域名服务器
修改ip地址和主机名的映射关系
vi /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4::1 localhost localhost.localdomain localhost6 localhost6.localdomain6192.168.33.61 min1192.168.33.62 min2192.168.33.63 min3
1.7 配置主机之间的免密ssh登陆
假如 min1 要登陆 min2
在min1上操作:
首先生成密钥对
ssh-keygen (提示时,直接回车即可)
再将min1自己的公钥拷贝并追加到min2的授权列表文件authorized_keys中
ssh-copy-id min2
验证效果:
ssh min2
[root@min1 ~]# ssh-keygenGenerating public/private rsa key pair.Enter file in which to save the key (/root/.ssh/id_rsa):Created directory '/root/.ssh'.Enter passphrase (empty for no passphrase):Enter same passphrase again:Your identification has been saved in /root/.ssh/id_rsa.Your public key has been saved in /root/.ssh/id_rsa.pub.The key fingerprint is:96:b9:d1:66:55:78:cb:36:5e:dd:b2:0e:34:48:7e:00 root@min1The key's randomart image is:+--[ RSA 2048]----+| E. .. || o ... || o o.o .o|| +o.+ * +|| S +o + = || . = . o || . o || . || |+-----------------+[root@min1 ~]#
[root@min1 ~]# ssh-copy-id min2root@ min2's password: 【hadoop】Now try logging into the machine, with "ssh 'min2'", and check in: .ssh/authorized_keys to make sure we haven't added extra keys that you weren't expecting.
[root@min1 ~]# ssh min2 Last login: Wed Jan 9 06:37:44 2019 from 192.168.33.2[root@min2 ~]#[root@min2 ~]#
1.8 minimal安装的系统出现的问题-命令缺失
会缺各种命令,安装软件时缺各种依赖
scp命令没有,可以通过安装获得:yum install -y openssh-clients
集群中每台机器上都要安装才行
(7)vi文本编辑器的使用
1.1 基本用法
vi fbb.txt
1、首先会进入"一般模式",此模式只接受各种快捷键,不能编辑文件内容
2、按i键,就会从一般模式进入编辑模式,此模式下,敲入的都是文件内容
3、编辑完成之后,按Esc键退出编辑模式,回到一般模式;
4、再按:,进入"底行命令模式",输入wq命令,回车即可
1.2 常用快捷键
一些有用的快捷键(在一般模式下使用):
a 在光标后一位开始插入
A 在该行的最后插入
I 在该行的最前面插入
gg 直接跳到文件的首行
G 直接跳到文件的末行
dd 删除行,如果 5dd ,则一次性删除光标后的5行
yy 复制当前行, 复制多行,则 3yy,则复制当前行附近的3行
p 粘贴
v 进入字符选择模式,选择完成后,按y复制,按p粘贴
ctrl+v 进入块选择模式,选择完成后,按y复制,按p粘贴
shift+v 进入行选择模式,选择完成后,按y复制,按p粘贴
查找并替换(在底行命令模式中输入)
%s/fbb/lyf 效果:查找文件中所有fbb,替换为lyf
/lyf 效果:查找文件中出现的lyf,并定位到第一个找到的地方,按n可以定位到下一个匹配位置(按N定位到上一个)
(8)压缩解压操作
1.gzip压缩
gzip a.txt
2.解压
gunzip a.txt.gz
gzip -d a.txt.gz
3.bzip2压缩
bzip2 a.txt
4.解压
bunzip2 a.txt.bz2
bzip2 -d a.txt.bz2
5.将当前目录的文件打包
tar -cvf bak.tar .
将/etc/password追加文件到bak.tar中(r)
tar -rvf bak.tar /etc/password
6.解压
tar -xvf bak.tar
7.打包并压缩gzip
tar -zcvf a.tar.gz .
8.解压缩
tar -zxvf a.tar.gz
解压到/usr/下
tar -zxvf a.tar.gz -C /usr
9.查看压缩包内容
tar -ztvf a.tar.gz
zip/unzip
10.打包并压缩成bz2
tar -jcvf a.tar.bz2
11.解压bz2
tar -jxvf a.tar.bz2
(9)linux服务管理
1 后台服务管理
service network status 查看指定服务的状态
service network stop 停止指定服务
service network start 启动指定服务
service network restart 重启指定服务
service --status-all 查看系统中所有的后台服务
2 设置后台服务的自启配置
chkconfig 查看所有服务器自启配置
chkconfig iptables off 关掉指定服务的自动启动
chkconfig iptables on 开启指定服务的自动启动
==添加mysql的自动启动服务===
开机启动:
chkconfig --add mysqld
chkconfig mysqld on
3 系统启动级别管理
vi /etc/inittab
Default runlevel. The runlevels used are:
0 - halt (Do NOT set initdefault to this)
1 - Single user mode
2 - Multiuser, without NFS (The same as 3, if you do not have networking)
3 - Full multiuser mode
4 - unused
5 - X11
6 - reboot (Do NOT set initdefault to this)
#
id:3:initdefault:
(10)域名服务器
1 原理图
2 主机名配置
修改主机名
vi /etc/sysconfig/network
NETWORKING=yes
HOSTNAME=minfbb
3 Hosts配置
修改ip地址和主机名的映射关系
vi /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4::1 localhost localhost.localdomain localhost6 localhost6.localdomain6192.168.33.61 min1192.168.33.62 min2192.168.33.63 min3
4 防火墙开关
关闭iptables并设置其开机启动/不启动
service iptables stop 关闭防火墙
chkconfig iptables on 设置开机启动防火墙
chkconfig iptables off 设置开机关闭防火墙
(11)Linux软件安装-jdk
1 上传安装包
使用sftp工具: alt+p 调出后,用put命令上传
1.1 上传(如果不指定目录,则上传到当前用户的主目录):
sftp> cd /root/
sftp> put g:\soft\jdk\jdk-7u45-linux-x64.tar.gz
1.2 下载(lcd指定下载到本地的目标路径)
sftp> lcd d:/
sftp> get /root/jdk-7u45-linux-x64.tar.gz
2 安装jdk
2.1 压缩解压缩的命令
2.1.1 压缩解压缩
root@mini1 ~]# gzip access.log
[root@mini1 ~]# ll
总用量 134892
-rw-r--r--. 1 root root 68 4月 3 17:37 access.log.gz
解压gz文件: gzip -d access.log.gz
2.1.2 打包解包
[root@mini1 ~]# tar -cvf actor.tar actor/
actor /
actor /fbb.txt
actor /lyf.txt
actor /ddrb.txt
2.1.3 解包:
[root@mini1 ~]# tar -xvf actor.tar
actor /
actor /fbb.txt
actor /lyf.txt
actor /ddrb.txt
2.1.4 打包压缩同时完成
2.1.5 产生压缩包:
[root@mini1 ~]# tar -zcvf actor.tar.gz actor /
actor /
actor /fbb.txt
actor /lyf.txt
actor /ddrb.txt
2.1.6 解压缩包:
[root@mini1 ~]# tar -zxvf actor.tar.gz
actor /
actor /fbb.txt
actor /lyf.txt
actor /ddrb.txt
2.2 安装jdk的过程
2.2.1 解压安装包
cd /root
tar -zxvf jdk-7u45-linux-x64.tar.gz -C apps/
2.2.2 修改环境变量
vi /etc/profile
2.2.3 文件最后添加
export JAVA_HOME=/root/apps/jdk1.7.0_45
export PATH=$PATH:$JAVA_HOME/bin
2.2.4 保存退出
2.2.5 重新加载环境变量
source /etc/profile
2.2.6 测试
[root@min1 jdk1.7.0_45]# java -version
出现如下,表示安装成功:
java version "1.7.0_45"
Java(TM) SE Runtime Environment (build 1.7.0_45-b18)
Java HotSpot(TM) 64-Bit Server VM (build 24.45-b08, mixed mode)
3 安装tomcat
3.1 上传apache-tomcat-7.0.68.tar.gz到Linux上
3.2 解压tomcat
tar -zxvf apache-tomcat-7.0.68.tar.gz -C /root/apps/
3.3 启动tomcat
/root/apps/apache-tomcat-7.0.68/bin/startup.sh
3.4 查看tomcat进程是否启动
jps
3.5 查看tomcat进程端口
netstat -ntlp //查看当前所有tcp端口
netstat -anpt | grep 2465 //查看进程占用的端口
netstat -ntulp |grep 80 //查看所有80端口使用情况·
netstat -an | grep 3306 //查看所有3306端口使用情况·
3.6 通过浏览器访问tomcat
http://192.168.33.61:8080/
(12)yum安装软件的方法
1 YUM安装方法
Yum(全称为 Yellow dog Updater, Modified)是一个在Fedora和RedHat以及SUSE、CentOS中的Shell前端软件包管理器。基於RPM包管理,能够从指定的服务器自动下载RPM包并且安装,可以自动处理依赖性关系,并且一次安装所有依赖的软件包,无须繁琐地一次次下载、安装。
例子(需要上网):
yum install gcc-c++
yum remove gcc-c++
yum update gcc-c++
2 光盘挂载到本地文件目录
mount -t iso9660 /dev/cdrom /mnt/cdrom
【-t 指定文件系统的类型;iso9660光盘或光盘镜像】
为了避免每次重启后都要手动mount,可以在/etc/fstab中加入一行挂载配置,即可自动挂载
vi /etc/fstab
/dev/cdrom /mnt/cdrom iso9660 defaults 0 0
3 本地yum仓库的安装配置
3.1 查看现有的yum源
yum repolist all
3.2 制作本地源的思路:
挂载iso至本地
通过http服务把yum暴露到内网中
修改yum的repo文件,指定内网yum依赖
3.3 新建本地挂载目录/mnt/cdrom
mkdir -p /mnt/cdrom
3.4 挂载ios至 /mnt/cdrom
mount /dev/cdrom /mnt/cdrom
将光盘挂在到本地文件目录中
mount -t iso9660 /dev/cdrom /mnt/cdrom
为了避免每次重启后都要手动mount,可以在/etc/fstab中加入一行挂载配置,即可自动挂载
vi /etc/fstab
/dev/cdrom /mnt/cdrom iso9660 defaults 0 0 ==================
minimal安装的系统出现的问题:缺各种命令,安装软件时缺各种依赖
scp命令都没有:yum install -y openssh-clients
每台机器上都要安装才行
3.5 安装httpd
yum -y install httpd
3.6 启动httpd
service httpd start
3.7 启动后查看是否开启成功
netstat -nltp | grep httpd
3.8 开放80端口
/sbin/iptables -I INPUT -p tcp --dport 80 -j ACCEPT
3.9 设置开机自动启动
chkconfig --add httpd
chkconfig httpd on
3.10 yum加入httpd服务
默认httpd的根目录是/var/www/html
只需在该目录下新建/mnt/cdrom的快捷键即可
ln -s /mnt/cdrom /var/www/html/repo
【-s 软链接(符号链接) 源头消失时,链接失效】
3.11 测试http服务
http://ip:80/repo
http://192.168.33.61/repo/
3.12 修改repo依赖文件
.repo文件是repository的简写,就是容器的意思,容器文件也就是我们常说的yum软件源配置文件。
repo文件在 /etc/yum.repos.d/
3.13 重命名所有文件,留下一个来修改
cd /etc/yum.repos.d/
rename .repo .repo.bak *.repo
mv CentOS-Media.repo.bak CentOS-Media.repo
vi CentOS-Media.repo 修改为
[c6-media]
name=CentOS-$releasever - Media
baseurl=http://192.168.33.61/repo
file:///media/CentOS/
file:///media/cdrom/
file:///media/cdrecorder/
gpgcheck=1
enabled=1
#gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
gpgkey=http://192.168.33.61/repo/RPM-GPG-KEY-CentOS-6
或者
[c6-media]
name=CentOS-$releasever - Media
baseurl=http://192.168.33.61/repo
file:///media/CentOS/
file:///media/cdrom/
file:///media/cdrecorder/
gpgcheck=0
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
3.14 查看本地源是否制作成功
yum repolist all
已加载插件:fastestmirror
Loading mirror speeds from cached hostfile
仓库标识 仓库名称 状态
c6-media CentOS-6 - Media 启用: 6,575
repolist: 6,575
3.15 最后通过本地yum安装telnet:
yum -y install telnet
已加载插件:fastestmirror
设置安装进程
Loading mirror speeds from cached hostfile
解决依赖关系
--> 执行事务检查
---> Package telnet.x86_64 1:0.17-48.el6 will be 安装
--> 完成依赖关系计算
依赖关系解决
软件包 架构 版本 仓库 大小
正在安装:
telnet x86_64 1:0.17-48.el6 c6-media 58 k
事务概要
Install 1 Package(s)
总下载量:58 k
Installed size: 109 k
下载软件包:
telnet-0.17-48.el6.x86_64.rpm | 58 kB 00:00
运行 rpm_check_debug
执行事务测试
事务测试成功
执行事务
正在安装 : 1:telnet-0.17-48.el6.x86_64 1/1
Verifying : 1:telnet-0.17-48.el6.x86_64 1/1
已安装:
telnet.x86_64 1:0.17-48.el6
完毕!
4 虚拟机错误
"\.\Global\vmx86" 的解决办法
1 在虚拟机安装目录下找vmx86.sys (ctrl+f), 一般在安装后的C:\Program Files (x86)\VMware\VMware Workstation目录下
2 把找到的vmx86.sys放到C:\windows\system32\drivers 目录下
3 开始,运行,cmd
4.在cmd里输入 net stop vmx86 回车
5.在cmd里输入 net start vmx86 回车 启动虚拟机!
(13)Linux下使用yum安装MySQL
Linux下使用yum安装MySQL,以及启动、登录和远程访问MySQL数据库。
1 安装mysql
1.1 查看有没有安装过
yum list installed mysql
rpm -qa | grep mysql
1.2 查看有没有安装包
yum list mysql
1.3 安装mysql客户端
yum install mysql
1.4 安装mysql 服务器端
yum install mysql-server
yum install mysql-devel
2 启动和停止服务
2.1 数据库字符集设置
mysql配置文件/etc/my.cnf中加入default-character-set=utf8
2.2 启动mysql服务
service mysqld start或者/etc/init.d/mysqld start
2.3 设置开机启动
chkconfig --add mysqld
chkconfig mysqld on
2.4 查看开机启动设置是否成功
chkconfig --list | grep mysql
mysqld 0:关闭 1:关闭 2:启用 3:启用 4:启用 5:启用 6:关闭
2.5 停止服务的命令
service mysqld stop
3 mysql授权访问权限
mysql -uroot -p#(执行下面的语句 .:所有库下的所有表 %:任何IP地址或主机都可以连接,'root123456'密码)GRANT ALL PRIVILEGES ON . TO 'root'@'%' IDENTIFIED BY 'root123456' WITH GRANT OPTION;FLUSH PRIVILEGES;
4 登录
创建root管理员: mysqladmin -u root password root123456
登录: mysql -u root -p输入密码即可。
忘记密码后重置密码: service mysqld stop
mysqld_safe --user=root --skip-grant-tables
mysql -u root
use mysql
update user set password=password("123456") where user="root";
flush privileges;
5 远程访问
开放防火墙的端口号
mysql增加权限:mysql库中的user表新增一条记录host为"%",user为"root"。
6 Linux MySQL的几个重要目录
数据库目录: /var/lib/mysql/
配置文件: /usr/share/mysql(mysql.server命令及配置文件)
相关命令: /usr/bin(mysqladmin mysqldump等命令)
启动脚本: /etc/rc.d/init.d/(启动脚本文件mysql的目录)
(14)mysql的用法
1 #登录数据库
mysql -h localhost -u root -p;
mysql -u root -p
2 #修改密码
mysqladmin -uroot -pold password new;
3 #显示数据库
show databases;
4 #显示数据表
show tables;
5 #选择数据库
use examples;
6 mysql授权访问权限
mysql -uroot -p#(执行下面的语句 .:所有库下的所有表 %:任何IP地址或主机都可以连接)GRANT ALL PRIVILEGES ON . TO 'root'@'%' IDENTIFIED BY 'root123456' WITH GRANT OPTION;FLUSH PRIVILEGES;
7 #创建数据库并设置编码utf-8 多语言
create database examples
default character set utf8 collate utf8_general_ci;
8 #删除数据库
drop database examples;
9 #创建表
create table test(
id int(10) unsigned zerofill not null auto_increment,
email varchar(40) not null,
ip varchar(15) not null,
state int(10) not null default '-1',
primary key (id)
);
10 #显示表结构
describe
11 #删除表
drop table test;
12 #重命名表
alter table test_old rename test_new;
13 #添加列
alter table test add cn int(4) not null;
14 #修改列
alter table test change id id1 varchar(10) not null;
15 #删除列
alter table test drop cn;
16 #创建索引
alter table test add index (cn,id);
17 #删除索引
alter table test drop index cn
18 #插入数据
insert into test (id,email,ip,state) values(2,'qq@qq.com','127.0.0.1','0');
19 #删除数据
delete from test where id = 1;
20 #修改数据
update test set id='1',email='q@qq.com' where id=1;
21 #查数据
select from test; #取所有数据
select from test limit 0,2; #取前两条数据
select from test email like '%qq%' #查含有qq字符 _表示一个 %表示多个
select from test order by id asc;#降序desc
select from test id not in('2','3');#id不含2,3或者去掉not表示含有
select from test timer between 1 and 10;#数据在1,10之间
#---------------------------表连接知识------------------------------
#等值连接又叫内链接 inner join 只返回两个表中连接字段相等的行
select from A inner join B on A.id = B.id; #写法1
select from A,B where A.id = B.id; #写法2
select a.id,a.title from A a inner join B b on a.id=b.id and a.id=1;#写法3 表的临时名称
select a.id as ID,a.title as 标题 from A inner join B on A.id=B.id;#添加as字句
#左连接又叫外连接 left join 返回左表中所有记录和右表中连接字段相等的记录
select * from A left join B on A.id = B.id;
select * from A left join (B,C,D) on (B.i1=A.i1 and C.i2=A.i2 and D.i3 = A.i3);#复杂连接
#右连接又叫外连接 right join 返回右表中所有记录和左表中连接字段相等的记录
select * from A right join B on A.id = B.id;
#完整外部链接 full join 返回左右表中所有数据
select * from A full join B on A.id = B.id;
#交叉连接 没有where字句 返回卡迪尔积
select * from A cross join B;
-------------表连接结束----------------
-----------------索引创建----------------
show index from A #查看索引
alter table A add primary key(id) #主键索引
alter table A add unique(name) #唯一索引
alter table A add index name(name) #普通索引
alter table A add fulltext(name) #全文索引
alter table A add index name(id,name) #多列索引
22 #常用函数
abs(-1)#绝对值
pi()#pi值
sqrt(2)#平方根
mod(-5,3)#取余-2
ceil(10.6)#进位+1 结果11 ceil(10.0)结果10
floor(10.6)#取整 10
round(2.5)#四舍五入到整数 结果3
round(2.5,2)#保留两位小数 结果2.50
truncate(2.5234,3)#取小数后3位不四舍五入 2.523
sign(-2);#符号函数 返回-1 0还是0 正数返回1
pow(2,3),exp(2);#2的3次幂 或e的2次幂
log(2),log10(2);#求对数
radians(180),degrees(0.618);#角度弧度转换
sin(0.5),asin(0.5)#正弦和反正弦 类似cos acos tan atan
length('hi')#计算字符长度
concat('1',1,'hi')#合并字符串
insert('12345',1,0,'7890');#从开头第1个字符开始到0个结束,替换成后边字符串,0表示在最前边插入
ucase('a'),lcase('A')#转成大写和小写
left('abcd',2),right('abcd',2);#返回前两个字符和后两个字符
ltrim(' 0 '),rtrim(' 0 '),trim(' 0 ')#删除空格
replace('1234567890','345678','0');#替换输出12090
substring('12345',1,2)#取字符 输出12 1是位置 2是长度
instr('1234','234');#取得234位置是2
reverse('1234');#反序输出4321
current()#返回日期
curtime()#返回时间
now()#返回日期时间
month(now())#当前月份 monthname 英文月份
dayname(now())#星期英文 dayofweek()1是星期天 weekday()1是星期二
week(now())#本年第多少周
dayofyear(now()),dayofmonth(now())#今天是本年第多少天 今天是本月第多少天
year(now()),month(now()),day(now()),hour(now()),minute(now()),second(now())#返回年月日 时分秒
time_to_sec(now()),sec_to_time(3600*8);#转换时间为秒和还原
version()#mysql版本
database()#当前连接的数据库 没有为null
user()#获取用户名
md5('a')#加密字符串
ascii('a')#ascii值97
bin(100),hex(100),oct(100)#返回二进制 十六进制 八进制
conv(10001,2,8);#各种进制相互转换
rand()#生成0到1之间随机数
sleep(0.02)#暂停秒数
23 数据库优化
. 开启缓存,尽量使用php函数而不是mysql
. explain select 语句可以知道性能
.一行数据使用 limit 1;
.为搜索字段重建索引 比如关键字 标签
.表连接join保证字段类型相同并且有其索引
.随机查询使用php $r = mysql_query("SELECT count() FROM user");
$d = mysql_fetch_row($r);
$rand = mt_rand(0,$d[0] - 1);
$r = mysql_query("SELECT username FROM user LIMIT $rand, 1");
.避免使用select 应该使用具体字段
.每张表都是用id主键,并且是unsigned int
.对于取值有限而固定使用enum类型,如性别 国家 名族 部门 状态
.尽可能使用not null ip存储使用int(4),使用ip 转化函数ip2long()相互long2ip()
.delete和insert语句会锁表,所以可以采用分拆语句操作
while(1){操作语句;usleep(2000);}
.选择正确的存储引擎;MyISAM适合大量查询 写操作多用InnoDB支持事务
24 #存储过程
#存储程序
delimiter #定义存储程序
create procedure getversion(out params varchar(20)) #params是传出参数 in传进 out传出 inout传回
begin
select version() into params; #版本信息赋值params
end
call getversion(@a); #调用存储过程
select @a;
delimiter #定义存储函数
create function display(w varchar(20)) returns varchar(20)
begin
return concat('hello',w);
end
select display('world');
drop procedure if exists spName; #删除一个存储过程
alter function spName [];#修改一个存储过程
show create procedure spName;#显示存储过程信息
declare varName type default value;#声明局部变量
#if语句
if 条件 then 语句
elseif 条件 then 语句
else 语句
end if
#case语句
case 条件
when 条件 then 语句
when 条件 then 语句
else 语句
end case
#loop语句
fn:loop
语句
end loop fn;
leave fn #退出循环
#while语句
fn:while 条件 do
语句
end while fn
25 #mysql使用帮助资料
? contents; #列出帮助类型
? data types;#列出数据类型
? int;#列出具体类型
? show;#show语句
? create table;#
26 #常见表的比较
Myisam BDB Memory InnoDB Archive
存储限制 no no yes 64T no
事物安全 支持 支持
锁机制 表锁 页锁 表锁 行锁 行锁
全文索引 支持
外键支持 支持
myisam frm存储表定义 MYD存储数据 MYI存储索引
InnoDB 用于事务处理
char 和 varchar保存和索引都不相同
浮点数float(10,2) 定点数decimal(10,2)
长度一定下,浮点数表示更大数据范围,缺点是引起精度丢失,货币等使用定点数存储
索引适合于where字句或者连接字句列
对于唯一值使用唯一索引
添加新用户 grant select,insert,update,delete on . to Yoby@localhost identified by 'mysql';
. 数据库名.表名,限制登录某一个数据库 test.* localhost是本地主机 网络可以使用 '%'代替所有主机 'mysql'是密码 Yoby是用户名 所有权限可以用 all代替
查看用户权限 show grants for 'root'@'localhost';
移除权限 revoke all on . from root@localhost;
group by id 分组
having 限制字句
select1 union select2 联合查询有重复去掉保留一行
select2 union all select2 所有行合并到结果集中去
(15)yum命令详解
yum(全称为 Yellow dog Updater, Modified)是一个在Fedora和RedHat以及SUSE中的Shell前端软件包管理器。基於RPM包管理,能够从指定的服务器自动下载RPM包并且安装,可以自动处理依赖性关系,并且一次安装所有依赖的软体包,无须繁琐地一次次下载、安装。yum提供了查找、安装、删除某一个、一组甚至全部软件包的命令,而且命令简洁而又好记。
yum的命令形式一般是如下:yum [options] [command] [package ...]
其中的[options]是可选的,选项包括-h(帮助),-y(当安装过程提示选择全部为"yes"),-q(不显示安装的过程)等等。[command]为所要进行的操作,[package ...]是操作的对象。
概括了部分常用的命令包括:
自动搜索最快镜像插件: yum install yum-fastestmirror
安装yum图形窗口插件: yum install yumex
查看可能批量安装的列表: yum grouplist
1.1 安装
yum install 全部安装
yum install package1 安装指定的安装包package1
yum groupinsall group1 安装程序组group1
1.2 更新和升级
yum update 全部更新
yum update package1 更新指定程序包package1
yum check-update 检查可更新的程序
yum upgrade package1 升级指定程序包package1
yum groupupdate group1 升级程序组group1
1.3 查找和显示
yum info package1 显示安装包信息package1
yum list 显示所有已经安装和可以安装的程序包
yum list package1 显示指定程序包安装情况package1
yum groupinfo group1 显示程序组group1信息yum search string 根据关键字string查找安装包
1.4 删除程序
yum remove | erase package1 删除程序包package1
yum groupremove group1 删除程序组group1
yum deplist package1 查看程序package1依赖情况
1.5 清除缓存
yum clean packages 清除缓存目录下的软件包
yum clean headers 清除缓存目录下的 headers
yum clean oldheaders 清除缓存目录下旧的 headers
yum clean, yum clean all (= yum clean packages; yum clean oldheaders) 清除缓存目录下的软件包及旧的headers
1.6 比如,要安装游戏程序组,
首先进行查找:
#:yum grouplist
可以发现,可安装的游戏程序包名字是"Games and Entertainment",这样就可以进行安装:
#:yum groupinstall "Games and Entertainment"
所 有的游戏程序包就自动安装了。在这里Games and Entertainment的名字必须用双引号选定,因为linux下面遇到空格会认为文件名结束了,因此必须告诉系统安装的程序包的名字是"Games and Entertainment"而不是"Games"。
此外,还可以修改配置文件/etc/yum.conf选择安装源。可见yum进行配置程序有多方便了吧。更多详细的选项和命令,当然只要在命令提示行下面:man yum
yum groupinstall "KDE (K Desktop Environment)"
yum install pirut k3b mikmod
yum groupinstall "Server Configuration Tools"
yum groupinstall "Sound and Video"
#yum groupinstall "GNOME Desktop Environment"
yum groupinstall "Legacy Software Support"
yum groupinstall "Development Libraries"
yum groupinstall "Development Tools"
#yum groupinstall "Windows File Server"
yum groupinstall "System Tools"
yum groupinstall "X Window System"
yum install php-gd
yum install gd-devel
yum groupinstall "Chinese Support"
#yum install samba-common //该执行会一起安装 samba-client
#yum install samba
yum install gcc
yum install cpp
yum install gcc-c++
yum install ncurses
yum install ncurses-devel
yum install gd-devel php-gd
yum install gd-devel
yum install gcc
yum install cpp
yum install gcc-c++
yum install ncurses
yum install ncurses-devel
yum install gd-devel php-gd
yum install gd-devel
yum install zlib-devel
yum install freetype-devel freetype-demos freetype-utils
yum install libpng-devel libpng10 libpng10-devel
yum install libjpeg-devel
yum install ImageMagick
yum install php-gd
yum install flex
yum install ImageMagick-devel
#yum install system-config-bind
#yum groupinstall "DNS Name Server" //安裝 bind 及 bind-chroot 套件
yum groupinstall "MySQL Database"'
yum clean all
装了个fedora linux不能用中文输入是一件很棘手的事,连搜解决方案都没法搜。只能勉强用几个拼音碰碰运气,看Google能不能识别了。而我就遇见了这样的事。
解决方案:
yum install scim* -y
2 yum 命令详解2:
Redhat和Fedora的软件安装命令是rpm,但是用rpm安装软件最大的麻烦就是需要手动寻找安装该软件所需要的一系列依赖关系,超级 麻烦不说,要是软件不用了需要卸载的话由于卸载掉了某个依赖关系而导致其他的软件不能用是非常恼人的。令人高兴的是,Fedora终于推出了类似于 ubuntu中的apt的命令yum,令Fedora的软件安装变得简单容易。Yum 有以下特点:
可以同时配置多个资源库(Repository)
简洁的配置文件(/etc/yum.conf)
自动解决增加或删除rpm包时遇到的倚赖性问题
使用方便
*保持与RPM数据库的一致性
yum,是Yellow dog Updater Modified的简称,起初是由yellow dog这一发行版的开发者Terra Soft研发,用python写成,那时还叫做yup(yellow dog updater),后经杜克大学的Linux@Duke开发团队进行改进,遂有此名。yum的宗旨是自动化地升级,安装/移除rpm包,收集rpm包的相关信息,检查依赖性并自动提示用户解决。yum的关键之处是要有可靠的repository,顾名思义,这是软件的仓库,它可以是http或ftp站点, 也可以是本地软件池,但必须包含rpm的header, header包括了rpm包的各种信息,包括描述,功能,提供的文件,依赖性等.正是收集了这些 header并加以分析,才能自动化地完成余下的任务。
1.yum的一切配置信息都储存在一个叫yum.conf的配置文件中,通常位于/etc目 录下,这是整个yum系统的重中之重,我在的F9中查看了这一文件,大家一起来看下:
[hanlong@localhost F9常用文档]$ sudo more /etc/yum.conf
[main]
cachedir=/var/cache/yum
keepcache=0
debuglevel=2
logfile=/var/log/yum.log
exactarch=1
obsoletes=1
gpgcheck=1
plugins=1
metadata_expire=1800
PUT YOUR REPOS HERE OR IN separate files named file.repo
in /etc/yum.repos.d
下面简单的对这一文件作简要的说明:
cachedir:yum缓存的目录,yum在此存储下载的rpm包和数据库,一般是/var/cache/yum。
debuglevel:除错级别,0──10,默认是2
logfile:yum的日志文件,默认是/var/log/yum.log。
exactarch,有两个选项1和0,代表是否只升级和你安装软件包cpu体系一致的包,如果设为1,则如你安装了一个i386的rpm,则yum不会用686的包来升级。
gpgchkeck= 有1和0两个选择,分别代表是否是否进行gpg校验,如果没有这一项,默认好像也是检查的。
2.好了,接下来就是yum的使用了,首先用yum来升级软件,yum的操作大都须有超级用户的权限,当然可以用sudo。
yum update,这一步是必须的,yum会从服务器的header目录下载rpm的header,放在本地的缓存中,这可能会花费一定的时间,但比起yum 给我们带来方便,这些时间的花费又算的了什么呢?header下载完毕,yum会判断是否有可更新的软件包,如果有,它会询问你的意见,是否更新,还是说 y吧,把系统始终up to date总是不错的,这时yum开始下载软件包并使用调用rpm安装,这可能要一定时间,取决于要更新软件的数目和网络状况,万一网络断了,也没关系,再 进行一次就可以了。升级完毕,以后每天只要使用yum check-update检查一下有无跟新,如果有,就用yum update进行跟新,时刻保持系统为最新,堵住一切发现的漏洞。用yum update packagename 对某个单独包进行升级。
现在简单的把yum软件升级的一些命令罗列一下:
(更新:我在安装wine的时候是用rpm一个一个安装的,先安装以来关系,然后在安装wine的主包,但是刚刚在论坛上发现来一个好的帖子,就yum的本地安装。参数是-localinstall
$yum localinstall wine-
这样的话,yum会自动安装所有的依赖关系,而不用rpm一个一个的安装了,省了好多工作。
还有一个与他类似的参数:
$yum localupdate wine-
如果有wine的新版本,而且你也下载到来本地,就可以这样本地更新wine了。)
2.1 列出所有可更新的软件清单
命令:yum check-update
2.2 安装所有更新软件
命令:yum update
2.3 仅安装指定的软件
命令:yum install
2.4 仅更新指定的软件
命令:yum update
2.5 列出所有可安裝的软件清单
命令:yum list
3 使用yum安装和卸载软件,
有个前提是yum安装的软件包都是rpm格式的。
安装的命令是,yum install xxx,yum会查询数据库,有无这一软件包,如果有,则检查其依赖冲突关系,如果没有依赖冲突,那么最好,下载安装;如果有,则会给出提示,询问是否要同时安装依赖,或删除冲突的包,你可以自己作出判断
删除的命令是,yum remove xxx,同安装一样,yum也会查询数据库,给出解决依赖关系的提示。
3.1 用YUM安装软件包
命令:yum install
3.2 用YUM删除软件包
命令:yum remove
3.3 用yum查询想安装的软件
我们常会碰到这样的情况,想要安装一个软件,只知道它和某方面有关,但又不能确切知道它的名字。这时yum的查询功能就起作用了。你可以用 yum search keyword这样的命令来进行搜索,比如我们要则安装一个Instant Messenger,但又不知到底有哪些,这时不妨用 yum search messenger这样的指令进行搜索,yum会搜索所有可用rpm的描述,列出所有描述中和messeger有关的rpm包,于是我们可能得到 gaim,kopete等等,并从中选择。
有时我们还会碰到安装了一个包,但又不知道其用途,我们可以用yum info packagename这个指令来获取信息。
1.使用YUM查找软件包
命令:yum search
2.列出所有可安装的软件包
命令:yum list
3.列出所有可更新的软件包
命令:yum list updates
4.列出所有已安装的软件包
命令:yum list installed
5.列出所有已安装但不在 Yum Repository 內的软件包
命令:yum list extras
6.列出所指定的软件包
命令:yum list 7.使用YUM获取软件包信息
命令:yum info 8.列出所有软件包的信息
命令:yum info
9.列出所有可更新的软件包信息
命令:yum info updates
10.列出所有已安裝的软件包信息
命令:yum info installed
11.列出所有已安裝但不在 Yum Repository 內的软件包信息
命令:yum info extras
12.列出软件包提供哪些文件
命令:yum provides
3.4 清除YUM缓存
yum 会把下载的软件包和header存储在cache中,而不会自动删除。如果我们觉得它们占用了磁盘空间,可以使用yum clean指令进行清除,更精确的用法是yum clean headers清除header,yum clean packages清除下载的rpm包,yum clean all 清除所有
1.清除缓存目录(/var/cache/yum)下的软件包
命令:yum clean packages
2.清除缓存目录(/var/cache/yum)下的 headers
命令:yum clean headers
3.清除缓存目录(/var/cache/yum)下旧的 headers
命令:yum clean oldheaders
4.清除缓存目录(/var/cache/yum)下的软件包及旧的headers
命令:yum clean, yum clean all (= yum clean packages; yum clean oldheaders)
以上所有命令参数的使用都可以用man来查看:
1、安装图形版yumex:yum install yumex。
2、安装额外的软件仓库:
rpm.livna.org 的软件包仓库:
rpm -ivh http://livna-dl.reloumirrors.net … ease-7-2.noarch.rpm
freshrpms.net 的软件包仓库:
rpm -ivh http://ftp.freshrpms.net/pub/fre … 1.1-1.fc.noarch.rpm
3、安装最快源 yum install yum-fastestmirror
资源真的是非常丰富,从Centos到Ubuntu,ISO镜像、升级包,应有尽有,上交的兄弟们真是幸福,羡慕啊。不过还好,我们好歹也算是在教育网内,凑合着也可以沾点光,下载一些。
网址为:ftp://ftp.sjtu.edu.cn/
相应的yum的repo为
[updates]
name=Fedora updates
baseurl=ftp://ftp.sjtu.edu.cn/fedora/linux/updates/$releasever/$basearch/
enabled=1
gpgcheck=0
[fedora]
name=Fedora $releasever - $basearch
baseurl=ftp://ftp.sjtu.edu.cn/fedora/linux/releases/$releasever/Everything/$basearch/os/
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-fedora file:///etc/pki/rpm-gpg/RPM-GPG-KEY
如果在机器上安装了apt管理器,则相应的源为
repomd ftp://ftp.sjtu.edu.cn/ fedora/linux/updates/$(VERSION)/$(ARCH)/
repomd ftp://ftp.sjtu.edu.cn/ fedora/linux/releases/$(VERSION)/Everything/$(ARCH)/os/
这与前面yum的源的格式上有一些差别,需要加以注意。
下面介绍一下fedora 下安装 scim
1. 什么输入法适合我?
fcitx和scim是目前比较好的输入法, 但是他们的特点不同,fcitx只能输入中文,而scim可以根据需要,利用不同的码表达到中英日…等等各种语言的输入问题。如果你只懂中文,或者只会输 入英文&中文,那么fcitx是一个不错的选择,因为它漂亮,小巧,实用。如果你还需要输入日文或者其他语言,那么你因该安装scim。通 过合理的配置,他能够让你像在windows里面一样,想输入什么语言就能输入什么语言,同一种语言想用什么输入法就用什么输入法。Scim的扩充性很 强,而且比较稳定,我就是选择的是scim.
2. 安装一个新输入法前需要哪些准备?
如果你选择fcitx或者scim,那么我建议你删除系统自带的中文输入法。方法如下:
rpm -qa | grep iiimf | xargs rpm -e
rpm -qa | grep Chinput| xargs rpm -e
如果有哪一行提示rpm: no packages given for erase那表示本身你的系统里面没有该输入法,不用担心,继续往下看就行了。
说 明:rpm -qa是列出所有安装的rpm包,grep iiimf是选择出其中名字含有iiimf的那些包,xargs rpm -e的意思是把前面列出的这些包删除掉。Xargs的作用就是把前面通过 | 传过来的数据作为下面命令的参数。这就好比一个过滤器,首先是放着所有的安装包,然后grep以后,只留下了含有某些特定关键字的rpm包,然后通过 xargs和rpm -e的组合运用,把剩下的这些含有某特定关键字的包删掉。这样就达到了删除该输入法及相关包的目的。下面的Chinput也是如此,在此不再重复。如果你还安装了其他输入法,比如你原来装的是fcitx,现在想装scim,那么你最好模仿上面的样子把fcitx删除,方法就是把iiimf的位置改成 fcitx就可以了。
在安装新输入法之前,最好这样做一下,因为多种输入法同时存在一个系统中没有什么好处,你只可能去用一个,而且他们同时存在可能有的时候会出现问题,想想也知道,会互相竞争嘛。所以在此以后,你应该保证系统里面已经没有中文输入法了。通过类似以下方式验证:
whereis fcitx
whereis scim
whereis miniChinput
…
3. 输入法是何时被系统调用的?
很多人不知道输入法到底什么时候被load进来,不知道这个当然就不知道为什么有的时候呼不出输入法(因为可能根本没有调入)当然也不会知道如何配置能够符合自己的要求。
大 家都知道,linux下面比较常用的有两个桌面系统,gnome和kde,这都无所谓,他们其实都是架在X系统之上的。简单的说X系统就是一个最核心,也 是最底层的桌面系统,gnome也好,kde也罢,或者其他的什么fvwm之类的,都只不过是X系统和用户之间的另一层软件而已。所以要想达到不管使用什 么桌面系统,都能调入输入法,就是要在X系统启动的时候,让输入法也启动起来,那么这样之后,无论你使用的是gnome还是kde或者其他什么桌面,都能 够调入输入法。因为当轮到他们启动的时候,X系统已经启动好了,输入法已经被系统调入了。那么X系统又是如何启动的呢?让我们从startx开始说起。
无论你用什么桌面系统,都是通过startx启动的,那么startx究竟是什么呢?一个应用程序还是一个脚本文件?为什么它能够启动各种桌面系统,并且能够按照相应的配置文件来设置呢?带着疑问,我在console里面输入whereis startx.
在 找到了存放startx的路径以后,用编辑器打开它发现原来是一个脚本文件。这个脚本文件的内容可能根据发行版不同,会有差异,如果你懂一些shell的 语言,那么你可以尝试看看,不一定要全部看懂,但是你大致看过以后会发现最后有一个xinit的命令,然后跟着一些参数。我尝试在console下面输入 xinit(注意,不要在图形界面下做此操作)
发现图形界面启动拉,但是很丑陋,什么功能都没有,鼠标可以动,还有一个可以输入命令的小窗口。怎 么退出来?ctrl+alt+backspace. 原来如此,startx只是一个脚本,里面通过对一系列配置文件的分析设置,最终利用xinit命令启动图形界面。不管是kde还是gnome,都是在这 个脚本中完成的。那么让我们再打开startx脚本看看里面还做了些什么。你仔细看看,会发现有一个东西很显眼,就是/etc/X11/xinit /xinitrc,这个xinitrc好像很眼熟,在配置输入法的其他贴中总是看到,这里出现了肯定是里面运行了这个脚本。再看其他的一些东西,其实都是利用shell配置出一个xinit启动的参数,用来配置桌面系统用的,不用管它。目前已知的就是startx的时候它会去执行一个/etc/X11 /xinit/xinitrc的脚本,让我们打开来看看里面有什么。
打开一看,其中一段我觉得最有价值,是一个for循环,他依次执行了/etc /X11/xinit/xinitrc.d/下面的所有脚本。你可以耐心的找一下,一定可以发现。那么这个目录里面有些什么内容呢?有一个文件看名字就知道和输入相关,他叫xinput。等等,让我们理一下,是怎么从startx到xinput的。
首先是执行startx这个脚本文件,里面他会执行xinitrc这个脚本,然后xinitrc脚本里面的,叫xinput。OK, 我们继续,打开xinput看看。
4.安装软件包
rpm -Uvh scim-0.8.2-1.i586.rpm
rpm -Uvh scim-chinese-0.2.6-1.i586.rpm
5.修改配置文件
接下来重要的一步就是,修改一下
/etc /X11/xinit/xinitrc.d/xinput文件,让SCIM在X启动的时候也启动。我看到网上很多文章也说过,但总是不得要领,经过自己试 验,最简单的就是把xinput文件里的Chinput全部替换为SCIM,chinput替换为scim,保存重启X就可以了。
zh_CN*)
if [ -e /usr/bin/scim ]; then
XIM="SCIM"
elif [ -e /usr/X11R6/bin/xcin ] ; then
export LC_CTYPE=zh_CN.GB2312
XIM="xcin-zh_CN.GB2312"
fi
;;
..............................
SCIM)
XIM_PROGRAM=scim
XIM_ARGS="-d"
;;
然后修改/etc/gtk-2.0/gtk.immodules,找到这一行:
"xim" "X Input Method" "gtk20" "/usr/share/locale" "ko:ja:zh"
改为:
"xim" "X Input Method" "gtk20" "/usr/share/locale" "en:ko:ja:zh"
可能表示输入英文时也使用该输入法
安装完毕后运行scim-setup,将输入法的切换键改为ctrl+space
(16)linux防火墙设置
1.1 常用操作
关闭iptables并设置其开机启动/不启动
service iptables stop 关闭防火墙
chkconfig iptables on 设置开机启动防火墙
chkconfig iptables off 设置开机关闭防火墙
1.2 查看帮助
iptables -h
man iptables
1.3 列出iptables规则
iptables -L -n
列出iptables规则并显示规则编号
iptables -L -n --line-numbers
列出iptables nat表规则(默认是filter表)
iptables -L -n -t nat
1.4 清除默认规则
(注意默认是filter表,如果对nat表操作要加-t nat)
#清楚所有规则
iptables -F
#重启iptables发现规则依然存在,因为没有保存
service iptables restart
#保存配置
service iptables save
#禁止ssh登陆(若果服务器在机房,一定要小心)
iptables -A INPUT -p tcp --dport 22 -j DROP
#删除规则
iptables -D INPUT -p tcp --dport 22 -j DROP
-A, --append chain追加到规则的最后一条
-D, --delete chain [rulenum]Delete rule rulenum (1 = first) from chain
-I, --insert chain [rulenum]Insert in chain as rulenum (default 1=first) 添加到规则的第一条
-p, --proto protoprotocol: by number or name, eg. 'tcp',常用协议有tcp、udp、icmp、all
-j, --jump target 常见的行为有ACCEPT、DROP和REJECT三种,但一般不用REJECT,会带来安全隐患
注意:INPUT和DROP这样的关键字需要大写
#禁止192.168.33.0网段从eth0网卡接入
iptables -A INPUT -p tcp -i eth0 -s 192.168.33.0 -j DROP
iptables -A INPUT -p tcp --dport 22 -i eth0 -s 192.168.33.61 -j ACCEPT
#禁止ip地址非192.168.10.10的所有类型数据接入
iptables -A INPUT ! -s 192.168.10.10 -j DROP
#禁止ip地址非192.168.10.10的ping请求
iptables -I INPUT -p icmp --icmp-type 8 -s 192.168.50.100 -j DROP
#扩展匹配:1.隐式扩展 2.显示扩展
#隐式扩展
-p tcp
--sport PORT 源端口
--dport PORT 目标端口
#显示扩展:使用额外的匹配规则
-m EXTENSTION --SUB-OPT
-p tcp --dport 22 与 -p tcp -m tcp --dport 22功能相同
state:状态扩展,接口ip_contrack追踪会话状态
NEW:新的连接请求
ESTABLISHED:已建立的连接请求
INVALID:非法连接
RELATED:相关联的连接
#匹配端口范围
iptables -I INPUT -p tcp --dport 22:80 -j DROP
#匹配多个端口
iptables -I INPUT -p tcp -m multiport --dport 22,80,3306 -j ACCEPT
#不允许源端口为80的数据流出
iptables -I OUTPUT -p tcp --sport 80 -j DROP
(17)制动化脚本部署
1.1 准备工作
1.1.1 在192.168.133.61安装了httpd
1.1.2 启动了httpd服务和端口
1.1.3 Sftp上传了jdk-7u45-linux-x64.tar.gz到/root 目录
1.1.4 本地安装了expect
yum install expect
1.1.5 本地生成了秘钥:
ssh-keygen
1.2 制作wget安装源
Httpd里放要安装的软件:
在192.68.33.61上:
Cd /var/www/html
mkdir soft/
cp /root/jdk-7u45-linux-x64.tar.gz /var/www/html/soft/
浏览器打开http://192.168.33.61/soft/
1.3 制作自动化安装脚本
1.3.1 把min2,min3的yum安装源指向本地
在min2,min3上执行如下命令:
cd /etc/yum.repos.d/
rename .repo .repo.bak *.repo
mv CentOS-Media.repo.bak CentOS-Media.repo
vi CentOS-Media.repo
修改为
[c6-media]name=CentOS-$releasever - Mediabaseurl=http://192.168.33.61/repo# file:///media/CentOS/# file:///media/cdrom/# file:///media/cdrecorder/gpgcheck=1enabled=1#gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6gpgkey=http://192.168.33.61/repo/RPM-GPG-KEY-CentOS-6
或者
[c6-media]name=CentOS-$releasever - Mediabaseurl=http://192.168.33.61/repo# file:///media/CentOS/# file:///media/cdrom/# file:///media/cdrecorder/gpgcheck=0enabled=1gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
查看本地源是否制作成功:
yum repolist all
1.3.2 Openssh安装
minimal安装的系统出现的问题:缺各种命令,安装软件时缺各种依赖
scp命令都没有:yum install -y openssh-clients
每台机器上都要安装才行
1.3.3 Wget 安装
yum install -y wget
1.3.4 Install_jdk.sh 安装单个JDK脚本
vi /root/install_jdk.sh
输入如下:
#!/bin/bashBASE_SERVER=192.168.33.61yum install -y wgetwget $BASE_SERVER/soft/jdk-7u45-linux-x64.tar.gztar -zxvf jdk-7u45-linux-x64.tar.gz -C /usr/localcat >> /etc/profile << EOFexport JAVA_HOME=/usr/local/jdk1.7.0_45export PATH=\$PATH:\$JAVA_HOME/binEOF
1.3.5 Login_all.sh免密登录所有linux脚本
免密登录脚本:
vi /root/login_all.sh
输入如下内容:
#!/bin/bashSERVERS="192.168.33.62 192.168.33.63"PASSWORD=hadoopBASE_SERVER=192.168.33.61auto_ssh_copy_id() { expect -c "set timeout -1; spawn ssh-copy-id $1; expect { (yes/no) {send -- yes\r;exp_continue;} assword: {send -- $2\r;exp_continue;} eof {exit 0;} }";}ssh_copy_id_to_all() { for SERVER in $SERVERS do auto_ssh_copy_id $SERVER $PASSWORD done}ssh_copy_id_to_all
1.3.6 Install_all.sh安装所有linux脚本
全部安装脚本:
vi /root/install_all.sh
输入如下内容:
#!/bin/bashSERVERS="192.168.33.62 192.168.33.63"PASSWORD=hadoopBASE_SERVER=192.168.33.61for SERVER in $SERVERSdo scp install_jdk.sh root@$SERVER:/root ssh root@$SERVER /root/install_jdk.shdone
1.4 执行安装脚本
在192.168.33.61上执行:
chmod +x login_all.sh install_all.sh install_jdk.shcd /root./login_all.sh./install_all.sh
完成后,到62,63上执行
source /etc/profile
java -version
(18)shell编程
1.1 主要内容
shell编程
1.2 什么是Shell
Shell是用户与内核进行交互操作的一种接口,目前最流行的Shell称为bash Shell
Shell也是一门编程语言<解释型的编程语言>,即shell脚本
一个系统可以存在多个shell,可以通过cat /etc/shells命令查看系统中安装的shell,不同的shell可能支持的命令语法是不相同的
1.3 Shell脚本的执行方式
1.3.1 第一种:输入脚本的绝对路径或相对路径
首先要赋予+x权限
/root/helloWorld.sh
./helloWorld.sh
或者,不用赋予+x权限,而用解释器解释执行
sh helloworld.sh
Shell脚本的执行方式
1.3.2 第二种:bash或sh +脚本
sh /root/helloWorld.sh
sh helloWorld.sh
Shell脚本的执行方式
1.3.3 第三种:在脚本的路径前再加". "
. /root/helloWorld.sh
. ./helloWorld.sh
区别:第一种和第二种会新开一个bash,不同bash中的变量无法共享
1.4 Shell中的变量
•Linux Shell中的变量分为"系统变量"和"用户自定义变量",可以通过set命令查看那系统变量
•系统变量:$HOME、$PWD、$SHELL、$USER等等
显示当前shell中所有变量 : set
1.4.1 定义变量
•变量=值 (例如STR=abc)
•等号两侧不能有空格
•变量名称一般习惯为大写
•双引号和单引号有区别,双引号仅将空格脱意,单引号会将所有特殊字符脱意
定义变量
STR="hello world"
A=9
unset A 撤销变量 A
readonly B=2 声明静态的变量 B=2 ,不能 unset
export 变量名 可把变量提升为全局环境变量,可供其他shell程序使用
1.4.2 将命令的返回值赋给变量
•A=ls -la
反引号,运行里面的命令,并把结果返回给变量A
•A=$(ls -la) 等价于反引号
1.4.3 Shell中的特殊变量
•$? 表示上一个命令退出的状态
•$$ 表示当前进程编号
•$0 表示当前脚本名称
•$n 表示n位置的输入参数(n代表数字,n>=1)
•$# 表示参数的个数,常用于循环
•$和$@ 都表示参数列表
1.4.4 $与$@区别
•$ 和 $@ 都表示传递给函数或脚本的所有参数,不被双引号" "包含时,都以$1 $2 … $n 的形式输出所有参数
•当它们被双引号" "包含时,"$" 会将所有的参数作为一个整体,以"$1 $2 … $n"的形式输出所有参数;"$@" 会将各个参数分开,以"$1" "$2" … "$n" 的形式输出所有参数
1.5 运算符
格式 :expr m + n 或$((m+n)) 注意expr运算符间要有空格
例如计算(2 +3 )×4 的值
1 .分步计算
S=expr 2 + 3
expr $S * 4
2.一步完成计算
expr expr 2 + 3
* 4
echo expr \
expr 2 + 3` * 4`
或
$(((2+3)*4))
1.6 for循环
•第一种:
for N in 1 2 3
do
echo $N
done
或
for N in 1 2 3; do echo $N; done
或
for N in {1..3}; do echo $N; done
for循环
•第二种:
for ((i = 0; i <= 5; i++))
do
echo "welcome $i times"
done
或
for ((i = 0; i <= 5; i++)); do echo "welcome $i times"; done
1.7 while循环
•第一种
while expression
do
command
…
done
while循环
•第二种
i=1
while ((i<=3))
do
echo $i
let i++
done
1.8 case语句
•格式
case $1 in
start)
echo "starting"
;;
stop)
echo "stoping"
;;
*)
echo "Usage: {start|stop} "
esac
1.9 read命令
read -p(提示语句)-n(字符个数) -t(等待时间)
read -p "please input your name: " NAME
使用示例:
1.10 if判断
•语法
if condition
then
statements
[elif condition
then statements. ..]
[else
statements ]
fi
if例子
#!/bin/bash
read -p "please input your name:" NAME
#printf '%s\n' $NAME
if [ $NAME = root ]
then
echo "hello ${NAME}, welcome !"
elif [ $NAME = itcast ]
then
echo "hello ${NAME}, welcome !"
else
echo "SB, get out here !"
fi
1.11 判断语句
•[ condition ] (注意condition前后要有空格)
#非空返回true,可使用$?验证(0为true,>1为false)
[ itcast ]
#空返回false
[ ]
判断语句
[ condition ] && echo OK || echo notok
条件满足,执行后面的语句
1.11.1 常用判断条件
= 字符串比较
-lt 小于
-le 小于等于
-eq 等于
-gt 大于
-ge 大于等于
-ne 不等于
常用判断条件
-r 有读的权限
-w 有写的权限
-x 有执行的权限
-f 文件存在并且是一个常规的文件
-s 文件存在且不为空
-d 文件存在并是一个目录
-b文件存在并且是一个块设备
-L 文件存在并且是一个链接
1.12 Shell自定义函数
语法
[ function ] funname [()]
{
action;
[return int;]
}
function start() / function start / start()
1.12.1 Shell自定义函数
•注意
1.必须在调用函数地方之前,先声明函数,shell脚本是逐行运行。不会像其它语言一样先预编译
2.函数返回值,只能通过$? 系统变量获得,可以显示加:return 返回,如果不加,将以最后一条命令运行结果,作为返回值。 return后跟数值n(0-255)
1.12.2 脚本调试
•sh -vx helloWorld.sh
•或者在脚本中增加set -x
(19)zookeeper介绍
1.1 场景:应用程序动态补位(高可用)
多个应用服务程序的健康状况注册,监听,调度:
A. 多个采集服务程序并行
B. 定期上报第三方自己的状态信息;
C. 定期监控第三方的状态;
D. 一旦发现某个服务下线了;就选出一台承担该下线的服务器的工作;
1.2 场景:服务程序的高可用(多机热备)
A. 多个服务器并行运行
B. 每个服务器都在第三方注册自己状态信息
C. 第三方监听各个服务器状态信息;并分配主从服务状态标志;
D. 客户端先读取第三方的状态信息,找到主服务的ip地址,进行访问;
E. 当主服务宕机了,第三方从新选举新的主服务,更新状态;
F. 客户机访问第三方信息,会获取到新的主服务的ip地址,取主服务进行访问;
1.3 zookeeper功能特点总结
A、zookeeper是为别的分布式程序服务的
B、Zookeeper本身就是一个分布式程序(只要有半数以上节点存活,zk就能正常服务)
C、Zookeeper所提供的服务涵盖:主从协调、服务器节点动态上下线、统一配置管理、分布式共享锁、统一名称服务……
D、虽然说可以提供各种服务,但是zookeeper在底层其实只提供了两个功能:
管理(存储,读取)用户程序提交的数据;
并为用户程序提供数据节点监听服务;
Zookeeper集群的角色: Leader 和 follower (Observer)
只要集群中有半数以上节点存活,集群就能提供服务
1 zookeeper功能介绍
1.1 场景:应用程序动态补位(高可用)
多个应用服务程序的运行状况注册,监听,调度:
多个采集服务程序并行
定期上报第三方自己的状态信息;
定期监控第三方的状态;
一旦发现某个服务下线了;就选出一台承担该下线的服务器的工作;
如图:
1、网站侧每日产生日志文件,推荐系统有三台数据采集服务器,采集日志;
2、三台数据采集服务器server01,server02,server03,定期向zookeeper集群汇报自己的运行状态(正常、宕机);
3、当server02宕机后,zookeeper集群感知到server02宕机;
4、zookeeper集群会让server03替代server02的采集工作;
1.2 场景:服务程序的高可用(多机热备)
多个服务器并行运行
每个服务器都在第三方注册自己状态信息
第三方监听各个服务器状态信息;并分配主从服务状态标志;
客户端先读取第三方的状态信息,找到主服务的ip地址,进行访问;
当主服务宕机了,第三方从新选举新的主服务,更新状态;
客户机访问第三方信息,会获取到新的主服务的ip地址,取主服务进行访问;
1、 三个服务启动,向zookeeper集群汇报自己状态,形成状态列表;
2、 选举可用服务server02
3、 客户端请求连接,可以获取server02信息
4、 客户端连接server02,进行操作
5、 当server02宕机,zookeeper集群感知到server02宕机更新状态列表
6、 选举可用服务server01
7、 客户端请求连接,可以获取server01信息
8、 客户端连接server01,进行操作
1.3 zookeeper功能特点总结
A、zookeeper是为别的分布式程序服务的
B、Zookeeper本身就是一个分布式程序(只要有半数以上节点存活,zk就能正常服务)
C、Zookeeper所提供的服务涵盖:主从协调、服务器节点动态上下线、统一配置管理、分布式共享锁、统一名称服务……
D、虽然说可以提供各种服务,但是zookeeper在底层其实只提供了两个功能:
1、 管理(存储,读取)用户程序提交的数据;
2、 并为用户程序提供数据节点监听服务;
Zookeeper集群的角色:
Leader 和 follower (Observer)
只要集群中有半数以上节点存活,集群就能提供服务
(20)zookeeper工作机制
投票算法:Paxos算法,衍生的azb算法;
配置文件包括三台机器min1,min2,min3;投票,投给id大的;
时序 事件 Min1【id=1】 Min2【id=2】 Min3【id=3】
1 Min1启动 投票给min1得票1(1小于半数2票,继续投) 得票0 得票0
2 Min1启动Min2启动 min1未发现min2投票给min1得票: min1 : 1 min2:1(小于2票,继续投) min2未发现min1投票给min2得票: min1 : 1 min2:1(小于2票,继续投)
3 发现了min2,又启动了投票,投给id大的;投票给min2得票: min1 : 0 min2:2(min2:leader,min1:follower) 投给id大的; 投票给min2得票: min1 : 0 min2:2(min2:leader,min1:follower)
4 Min3启动 (min2:leader,min1:follower) (min2:leader,min1:follower) 发现已经有leader,直接变为follower
5 发现了min3为follower(min2:leader,min1:follower,min3:follower) 发现了min3为follower(min2:leader,min1:follower,min3:follower) (min2:leader,min1:follower,min3:follower)
架构如下图:
(21)安装Zookeeper
1.1 准备工作
安装到3台虚拟机上
安装好JDK
1.2 Rz工具安装
安装 yum install lrzsz
拖入后,右键send to zoom或者输入rz回车;
1.3 上传安装文件
输入rz回车;
选择zookeeper-3.4.5.tar.gz
确定后上传成功
1.4 解压安装文件
mkdir /root/apps/
cd /root
tar -zxvf zookeeper-3.4.5.tar.gz -C apps (解压)
1.5 安装文件重命名
cd apps
mv /root/apps/zookeeper-3.4.5 /root/apps/zookeeper (重命名文件夹zookeeper-3.4.5为zookeeper)
1.6 修改环境变量
1、su - root(切换用户到root)
2、vi /etc/profile (修改文件)
3、添加内容:
export ZOOKEEPER_HOME=/root/apps/zookeeperexport PATH=$PATH:$ZOOKEEPER_HOME/bin
4、重新编译文件生效:
source /etc/profile
5、注意:3台zookeeper都需要修改
1.7 修改配置文件
编辑配置文件
cd /root/apps/zookeeper/conf
cp /root/apps/zookeeper/conf/zoo_sample.cfg /root/apps/zookeeper/conf/zoo.cfg
vi /root/apps/zookeeper/conf/zoo.cfg
添加内容:
dataDir=/root/zkdata#日志目录不能缺,否则会报错dataLogDir=/root/zklogserver.1=min1:2888:3888server.2=min2:2888:3888server.3=min3:2888:3888# (主机名, 心跳端口、数据端口)
或
dataDir=/root/zkdata#日志目录不能缺,否则会报错dataLogDir=/root/zklogserver.1=192.168.33.61:2888:3888server.2= 192.168.33.62:2888:3888server.3= 192.168.33.63:2888:3888# (主机名, 心跳端口、数据端口)
写入id信息:
mkdir /root/zkdata
cd /root/zkdata
echo 1 > myid
mkdir /root/zklog
1.8 拷贝安装结果到其他机器
将zookeeper拷贝到min2,min3
在min2 上:
mkdir -r /root/apps/
在min1 上:
scp -r /root/apps/zookeeper root@192.168.33.62:/root/apps/
在min3 上:
mkdir -r /root/apps/
在min1 上:
scp -r /root/apps/zookeeper root@192.168.33.63:/root/apps/
1.9 在min2上操作myid:
cd /root
mkdir zkdata
cd /root/zkdata
echo 2 > myid
mkdir /root/zklog
1.10 在min3上操作myid:
cd /root
mkdir zkdata
cd /root/zkdata
echo 3 > myid
mkdir /root/zklog
1.11 关闭三台服务器防火墙:
service iptables stop
1.12 三台服务器启动服务
cd /root/apps/zookeeper/
/root/apps/zookeeper/bin/zkServer.sh start
在secureCRT批量发送
1.13 查看集群状态
/root/apps/zookeeper/bin/zkServer.sh status
1、 jps(查看进程)
2、 zkServer.sh status(查看集群状态,主从信息)
min1:
[root@min1 zookeeper]# zkServer.sh status
JMX enabled by default
Using config: /root/apps/zookeeper/bin/../conf/zoo.cfg
Mode: follower
min2:
[root@min2 zkdata]# zkServer.sh status
JMX enabled by default
Using config: /root/apps/zookeeper/bin/../conf/zoo.cfg
Mode: follower
[root@min3 zkdata]# zkServer.sh status
JMX enabled by default
Using config: /root/apps/zookeeper/bin/../conf/zoo.cfg
Mode: leader
1.14 测试:停掉min3,观察新的投票结果
在min3上执行:
[root@min3 zkdata]# jps
2183 Jps
2079 QuorumPeerMain
[root@min3 zkdata]# kill -9 2079
执行:zkServer.sh status
Min1:
[root@min1 zookeeper]# zkServer.sh status
JMX enabled by default
Using config: /root/apps/zookeeper/bin/../conf/zoo.cfg
Mode: leader
【变为leader】
Min2:
[root@min2 zkdata]# zkServer.sh status
JMX enabled by default
Using config: /root/apps/zookeeper/bin/../conf/zoo.cfg
Mode: follower
Min3:
[root@min3 zkdata]# zkServer.sh status
JMX enabled by default
Using config: /root/apps/zookeeper/bin/../conf/zoo.cfg
Error contacting service. It is probably not running.
(22)zookeeper结构和命令
1.1 zookeeper两大功能:
读写数据:往往是状态信息或配置信息
提供监听:发现数据的变化情况
1.2 zookeeper特性
1、Zookeeper:一个leader,多个follower组成的集群
2、 全局数据一致:每个server保存一份相同的数据副本,client无论连接到哪个server,数据都是一致的
3、分布式读写,更新请求转发,由leader实施
4、更新请求顺序进行,来自同一个client的更新请求按其发送顺序依次执行
5、数据更新原子性,一次数据更新要么成功,要么失败
6、实时性,在一定时间范围内,client能读到最新数据
1.3 zookeeper数据结构
1、层次化的目录结构,命名符合常规文件系统规范(见下图)
2、每个节点在zookeeper中叫做znode,并且其有一个唯一的路径标识
3、节点Znode可以包含数据和子节点(但是EPHEMERAL类型的节点不能有子节点,下一页详细讲解)
4、客户端应用可以在节点上设置监视器(后续详细讲解)
1.4 数据结构图
1.5 读写节点数据:
1.5.1 命令行连接zk服务器
zkCli.sh
返回如下信息:
[root@min1 ~]# zkCli.shConnecting to localhost:21812018-11-13 07:30:14,084 [myid:] - INFO [main:Environment@100] - Client environment:zookeeper.version=3.4.5-1392090, built on 09/30/2012 17:52 GMT2018-11-13 07:30:14,094 [myid:] - INFO [main:Environment@100] - Client environment:host.name=min12018-11-13 07:30:14,095 [myid:] - INFO [main:Environment@100] - Client environment:java.version=1.7.0_452018-11-13 07:30:14,099 [myid:] - INFO [main:Environment@100] - Client environment:java.vendor=Oracle Corporation2018-11-13 07:30:14,099 [myid:] - INFO [main:Environment@100] - Client environment:java.home=/root/apps/jdk1.7.0_45/jre2018-11-13 07:30:14,100 [myid:] - INFO [main:Environment@100] - Client environment:java.class.path=/root/apps/zookeeper/bin/../build/classes:/root/apps/zookeeper/bin/../build/lib/.jar:/root/apps/zookeeper/bin/../lib/slf4j-log4j12-1.6.1.jar:/root/apps/zookeeper/bin/../lib/slf4j-api-1.6.1.jar:/root/apps/zookeeper/bin/../lib/netty-3.2.2.Final.jar:/root/apps/zookeeper/bin/../lib/log4j-1.2.15.jar:/root/apps/zookeeper/bin/../lib/jline-0.9.94.jar:/root/apps/zookeeper/bin/../zookeeper-3.4.5.jar:/root/apps/zookeeper/bin/../src/java/lib/.jar:/root/apps/zookeeper/bin/../conf:2018-11-13 07:30:14,100 [myid:] - INFO [main:Environment@100] - Client environment:java.library.path=/usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib2018-11-13 07:30:14,101 [myid:] - INFO [main:Environment@100] - Client environment:java.io.tmpdir=/tmp2018-11-13 07:30:14,101 [myid:] - INFO [main:Environment@100] - Client environment:java.compiler=
1.5.2 切换连接的服务器
connect 192.168.33.62:2181 connect min2:2181
返回:
[zk: localhost:2181(CONNECTED) 1] connect min2:21812018-11-13 07:31:44,978 [myid:] - INFO [main-EventThread:ClientCnxn$EventThread@509] - EventThread shut down2018-11-13 07:31:44,979 [myid:] - INFO [main:ZooKeeper@684] - Session: 0x1670a2f4010000a closed2018-11-13 07:31:44,985 [myid:] - INFO [main:ZooKeeper@438] - Initiating client connection, connectString=min2:2181 sessionTimeout=30000 watcher=org.apache.zookeeper.ZooKeeperMain$MyWatcher@7bae9cec2018-11-13 07:31:44,988 [myid:] - INFO [main-SendThread(min2:2181):ClientCnxn$SendThread@966] - Opening socket connection to server min2/192.168.33.62:2181. Will not attempt to authenticate using SASL (unknown error)ZooKeeper -server host:port cmd args connect host:port get path [watch] ls path [watch] set path data [version] rmr path delquota [-n|-b] path quit printwatches on|off create [-s] [-e] path data acl stat path [watch] close ls2 path [watch] history listquota path setAcl path acl getAcl path sync path redo cmdno addauth scheme auth delete path [version] setquota -n|-b val path[zk: min2:2181(CONNECTING) 2] 2018-11-13 07:31:44,990 [myid:] - INFO [main-SendThread(min2:2181):ClientCnxn$SendThread@849] - Socket connection established to min2/192.168.33.62:2181, initiating session2018-11-13 07:31:44,996 [myid:] - INFO [main-SendThread(min2:2181):ClientCnxn$SendThread@1207] - Session establishment complete on server min2/192.168.33.62:2181, sessionid = 0x2670a2f1b430005, negotiated timeout = 30000 WATCHER:: WatchedEvent state:SyncConnected type:None path:null [zk: min2:2181(CONNECTED) 2]
1.5.3 查看节点
ls
[zk: min2:2181(CONNECTED) 7] ls /[zookeeper]
1.5.4 创建节点
create /app1 "this is app1 servers parent"
[zk: min2:2181(CONNECTED) 8] create /app1 "this is app1 servers parent"Created /app1
ls
[zk: min2:2181(CONNECTED) 10] ls /[app1, zookeeper]
create /app1/server01 "192.168.33.61,100"
[zk: min2:2181(CONNECTED) 11] create /app1/server01 "192.168.33.61,100"Created /app1/server01
[zk: min2:2181(CONNECTED) 12] ls /app1[server01]
1.5.5 获取节点数据
get /app1/server01
[zk: localhost:2181(CONNECTED) 0] get /app1/server01"192.168.33.61,100"cZxid = 0x200000023 #内部事务编号ctime = Tue Nov 13 07:58:10 CST 2018 #创建时间mZxid = 0x200000023mtime = Tue Nov 13 07:58:10 CST 2018 #修改时间pZxid = 0x200000023 #持久化事务cversion = 0 #创建版本dataVersion = 0 #数据版本aclVersion = 0ephemeralOwner = 0x0dataLength = 19 #数据长度numChildren = 0 #子节点数
1.5.6 创建一个短暂节点
1.5.6.1 创建短暂节点
[zk: localhost:2181(CONNECTED) 2] create -e /app-emphemeral 181818Created /app-emphemeral
1.5.6.2 查看节点信息
[zk: localhost:2181(CONNECTED) 4] ls /[app1, app-emphemeral, zookeeper] #可以看到临时节点
1.5.6.3 退出后再链接进去查看节点信息
quitzkCli.shls /[zk: localhost:2181(CONNECTED) 0] ls /[app1, zookeeper] #临时节点已经没有了;
1.5.7 创建带有序号的节点
[zk: localhost:2181(CONNECTED) 18] create /test 888Created /test[zk: localhost:2181(CONNECTED) 19] create -s /test/aa 999Created /test/aa0000000000
继续创建
[zk: localhost:2181(CONNECTED) 20] create -s /test/aa 999Created /test/aa0000000001 #会自动增加序号添加节点[zk: localhost:2181(CONNECTED) 21] create -s /test/aa 999Created /test/aa0000000002[zk: localhost:2181(CONNECTED) 22] create -s /test/aa 999Created /test/aa0000000003[zk: localhost:2181(CONNECTED) 23] create -s /test/aa 999Created /test/aa0000000004[zk: localhost:2181(CONNECTED) 24] create -s /test/aa 999Created /test/aa0000000005[zk: localhost:2181(CONNECTED) 25] create -s /test/aa 999Created /test/aa0000000006[zk: localhost:2181(CONNECTED) 26] create -s /test/aa 999Created /test/aa0000000007[zk: localhost:2181(CONNECTED) 27] create -s /test/bb 999Created /test/bb0000000008[zk: localhost:2181(CONNECTED) 28] create -s /test/bb 999Created /test/bb0000000009[zk: localhost:2181(CONNECTED) 29] create -s /test/cc 999Created /test/cc0000000010[zk: localhost:2181(CONNECTED) 30] create -s /test/cc 999
创建临时的带序号的节点
[zk: localhost:2181(CONNECTED) 31] create -e -s /test/cc 999Created /test/cc0000000012
1.5.8 多服务器更新数据同步
61上操作:
[zk: localhost:2181(CONNECTED) 33] set /app1 111cZxid = 0x200000022ctime = Tue Nov 13 07:55:17 CST 2018mZxid = 0x200000041mtime = Tue Nov 13 08:41:24 CST 2018pZxid = 0x200000023cversion = 1dataVersion = 1aclVersion = 0ephemeralOwner = 0x0dataLength = 3numChildren = 1[zk: localhost:2181(CONNECTED) 34] get /app1111cZxid = 0x200000022ctime = Tue Nov 13 07:55:17 CST 2018mZxid = 0x200000041mtime = Tue Nov 13 08:41:24 CST 2018pZxid = 0x200000023cversion = 1dataVersion = 1aclVersion = 0ephemeralOwner = 0x0dataLength = 3numChildren = 1[zk: localhost:2181(CONNECTED) 35]
登录62,操作:
zkCli.sh #登录62本机[zk: localhost:2181(CONNECTED) 0] get /app1111cZxid = 0x200000022ctime = Tue Nov 13 07:55:17 CST 2018mZxid = 0x200000041mtime = Tue Nov 13 08:41:24 CST 2018pZxid = 0x200000023cversion = 1dataVersion = 1aclVersion = 0ephemeralOwner = 0x0dataLength = 3numChildren = 1[zk: localhost:2181(CONNECTED) 1] set /app1 222cZxid = 0x200000022ctime = Tue Nov 13 07:55:17 CST 2018mZxid = 0x200000046mtime = Tue Nov 13 08:43:54 CST 2018pZxid = 0x200000023cversion = 1dataVersion = 2aclVersion = 0ephemeralOwner = 0x0dataLength = 3numChildren = 1[zk: localhost:2181(CONNECTED) 2] get /app1222cZxid = 0x200000022ctime = Tue Nov 13 07:55:17 CST 2018mZxid = 0x200000046mtime = Tue Nov 13 08:43:54 CST 2018pZxid = 0x200000023cversion = 1dataVersion = 2aclVersion = 0ephemeralOwner = 0x0dataLength = 3numChildren = 1
在61上查看
[zk: localhost:2181(CONNECTED) 0] get /app1222cZxid = 0x200000022ctime = Tue Nov 13 07:55:17 CST 2018mZxid = 0x200000046mtime = Tue Nov 13 08:43:54 CST 2018pZxid = 0x200000023cversion = 1dataVersion = 2aclVersion = 0ephemeralOwner = 0x0dataLength = 3numChildren = 1
1.6 监听事件
1.6.1 数据变化监听
61上监听:
[zk: localhost:2181(CONNECTED) 1] get /app1 watch322cZxid = 0x200000022ctime = Tue Nov 13 07:55:17 CST 2018mZxid = 0x200000046mtime = Tue Nov 13 08:43:54 CST 2018pZxid = 0x200000023cversion = 1dataVersion = 2aclVersion = 0ephemeralOwner = 0x0dataLength = 3numChildren = 1[zk: localhost:2181(CONNECTED) 2]WATCHER::
62上修改
[zk: localhost:2181(CONNECTED) 3] set /app1 333cZxid = 0x200000022ctime = Tue Nov 13 07:55:17 CST 2018mZxid = 0x200000048mtime = Tue Nov 13 08:55:45 CST 2018pZxid = 0x200000023cversion = 1dataVersion = 3aclVersion = 0ephemeralOwner = 0x0dataLength = 3numChildren = 1
在61上发生变化:注意,该事件只接受一次;再修改就不会接受到监听了;
[zk: localhost:2181(CONNECTED) 2]WATCHER::WatchedEvent state:SyncConnected type:NodeDataChanged path:/app1
1.6.2 子节点变化监听
61上开启节点监听
[zk: localhost:2181(CONNECTED) 4] ls /app1 watch[server01]
62上操作,增加节点
[zk: localhost:2181(CONNECTED) 4] create /app1/app2 222Created /app1/app2
查看61
[zk: localhost:2181(CONNECTED) 5]WATCHER:: WatchedEvent state:SyncConnected type:NodeChildrenChanged path:/app1
[zk: localhost:2181(CONNECTED) 5] ls /app1[app2, server01]
1.7 节点类型
1.7.1 Znode有两种类型:
短暂(ephemeral)(断开连接自己删除)
如果创建的客户端断开,那么会被自动删除;
用于服务器掉线的自动感知,掉线后自动删除,那么就知道不存在了;
持久(persistent)(断开连接不删除)
如果创建的客户端断开,那么不会被自动删除;
1.7.2 Znode有四种形式的目录节点(默认是persistent )
PERSISTENT(持久节点)
PERSISTENT_SEQUENTIAL(持久序列/test0000000019 )
EPHEMERAL(临时节点)
EPHEMERAL_SEQUENTIAL (临时序列/test0000000019)
创建znode时设置顺序标识,znode名称后会附加一个值,顺序号是一个单调递增的计数器,由父节点维护
在分布式系统中,顺序号可以被用于为所有的事件进行全局排序,这样客户端可以通过顺序号推断事件的顺序
(23)zookeeper客户端命令
zookeeper命令行操作
运行 zkCli.sh -server
1、使用 ls 命令来查看当前 ZooKeeper 中所包含的内容:
[zk: 202.115.36.251:2181(CONNECTED) 1] ls /
2、创建一个新的 znode ,使用 create /zk myData 。这个命令创建了一个新的 znode 节点" zk "以及与它关联的字符串:
[zk: 202.115.36.251:2181(CONNECTED) 2] create /zk "myData"
3、我们运行 get 命令来确认 znode 是否包含我们所创建的字符串:
[zk: 202.115.36.251:2181(CONNECTED) 3] get /zk
#监听这个节点的变化,当另外一个客户端改变/zk时,它会打出下面的
#WATCHER::
#WatchedEvent state:SyncConnected type:NodeDataChanged path:/zk
[zk: localhost:2181(CONNECTED) 4] get /zk watch
4、下面我们通过 set 命令来对 zk 所关联的字符串进行设置:
[zk: 202.115.36.251:2181(CONNECTED) 4] set /zk "zsl"
5、下面我们将刚才创建的 znode 删除:
[zk: 202.115.36.251:2181(CONNECTED) 5] delete /zk
6、删除节点:rmr
[zk: 202.115.36.251:2181(CONNECTED) 5] rmr /zk
zookeeper命令行操作
运行 zkCli.sh -server
1、使用 ls 命令来查看当前 ZooKeeper 中所包含的内容:
[zk: 202.115.36.251:2181(CONNECTED) 1] ls /
2、创建一个新的 znode ,使用 create /zk myData 。这个命令创建了一个新的 znode 节点" zk "以及与它关联的字符串:
[zk: 202.115.36.251:2181(CONNECTED) 2] create /zk "myData"
3、我们运行 get 命令来确认 znode 是否包含我们所创建的字符串:
[zk: 202.115.36.251:2181(CONNECTED) 3] get /zk
#监听这个节点的变化,当另外一个客户端改变/zk时,它会打出下面的
#WATCHER::
#WatchedEvent state:SyncConnected type:NodeDataChanged path:/zk
[zk: localhost:2181(CONNECTED) 4] get /zk watch
4、下面我们通过 set 命令来对 zk 所关联的字符串进行设置:
[zk: 202.115.36.251:2181(CONNECTED) 4] set /zk "zsl"
5、下面我们将刚才创建的 znode 删除:
[zk: 202.115.36.251:2181(CONNECTED) 5] delete /zk
6、删除节点:rmr
[zk: 202.115.36.251:2181(CONNECTED) 5] rmr /zk
rmr删除节点命令,rmr命令与delete命令不同的是delete不可删除有子节点的节点,但是rmr命令可以删除,注意路径为绝对路径。
(24) zookeeper原理
Zookeeper虽然在配置文件中并没有指定master和slave
但是,zookeeper工作时,是有一个节点为leader,其他则为follower
Leader是通过内部的选举机制临时产生的
1.1 zookeeper的选举机制(全新集群paxos)
以一个简单的例子来说明整个选举的过程.
假设有五台服务器组成的zookeeper集群,它们的id从1-5,同时它们都是最新启动的,也就是没有历史数据,在存放数据量这一点上,都是一样的.假设这些服务器依序启动,来看看会发生什么.
1) 服务器1启动,此时只有它一台服务器启动了,它发出去的包没有任何响应,所以它的选举状态一直是LOOKING状态
2) 服务器2启动,它与最开始启动的服务器1进行通信,互相交换自己的选举结果,由于两者都没有历史数据,所以id值较大的服务器2胜出,但是由于没有达到超过半数以上的服务器都同意选举它(这个例子中的半数以上是3),所以服务器1,2还是继续保持LOOKING状态.
3) 服务器3启动,根据前面的理论分析,服务器3成为服务器1,2,3中的老大,而与上面不同的是,此时有三台服务器选举了它,所以它成为了这次选举的leader.
4) 服务器4启动,根据前面的分析,理论上服务器4应该是服务器1,2,3,4中最大的,但是由于前面已经有半数以上的服务器选举了服务器3,所以它只能接收当小弟的命了.
5) 服务器5启动,同4一样,当小弟.
1.2 非全新集群的选举机制(数据恢复)
那么,初始化的时候,是按照上述的说明进行选举的,但是当zookeeper运行了一段时间之后,有机器down掉,重新选举时,选举过程就相对复杂了。
需要加入数据id、leader id和逻辑时钟。
数据id:数据新的id就大,数据每次更新都会更新id。
Leader id:就是我们配置的myid中的值,每个机器一个。
逻辑时钟:这个值从0开始递增,每次选举对应一个值,也就是说: 如果在同一次选举中,那么这个值应该是一致的 ; 逻辑时钟值越大,说明这一次选举leader的进程更新.
选举的标准就变成:
1、逻辑时钟小的选举结果被忽略,重新投票
2、统一逻辑时钟后,数据id大的胜出
3、数据id相同的情况下,leader id大的胜出
根据这个规则选出leader。
(25)zookeeper自动化维护脚本
1.1 export与source
export的用法
export a=1
export: 会把变量对于本进程及子进程有效;
source的用法
source /etc/profile
source:会把脚本文件的变量放到当前进程里有效;
1.2 远程启动zookeeper
ssh min2 "source /etc/profile;/root/apps/zookeeper/bin/zkServer.sh start"
[root@min1 ~]# ssh min2 "source /etc/profile;/root/apps/zookeeper/bin/zkServer.sh start"JMX enabled by defaultUsing config: /root/apps/zookeeper/bin/../conf/zoo.cfgStarting zookeeper ... STARTED
1.3 启动脚本startzk.sh
[root@min1 ~]# vi startzk.sh#!/bin/shecho "start zkServer..."for i in 1 2 3dossh min$i "source /etc/profile;/root/apps/zookeeper/bin/zkServer.sh start"done
免密登录,并执行
ssh-copy-id min1
ssh-copy-id min2
ssh-copy-id min2
chmod +x startzk.sh
./startzk.sh
1.4 停止服务的脚本stopzk.sh
[root@min1 ~]# vi stopzk.sh#!/bin/shecho "stop zkServer..."for i in 1 2 3dossh min$i "source /etc/profile;/root/apps/zookeeper/bin/zkServer.sh stop"done
chmod +x stopzk.sh
./stopzk.sh