VARCHAR(N)类型,utf8编码,则N最大值为多少,n表示什么?

有道面试题:若一张表中只有一个字段VARCHAR(N)类型,utf8编码,则N最大值为多少? 先明白计算的一些规则限制 4.0版本以下,varchar(20),指的是20字节,如果存放UTF8汉字时,只能存6个(每个汉字3字节) 5.0版本以上,varchar(20),指的是20字符,无论存放的是数字、字母还是UTF8汉字(每个汉字3字节),都可以存放20个,最大大小是65532字节 ① 存储限制 需要额外地在长度列表上存放实际的字符长度:小于255为1个字节,大于255则要2个字节 ② 编码限制 gbk:每个字符最多占用2个字节 utf8:每个字符最多占用3个字节 ③ 长度限制 MySQL定义行的长度不能超过65535,这个限制了列的数目,比如char(255) utf8 那么列的数目最多有65535/(255*3)=85,列的数目可以从这里得到依据 行长度计算公式如下: row length = 1 + (sum of column lengths) + (number of NULL…

CentOS下安装JDK1.7

1、源码包准备: 首先到官网下载jdk,http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html,我下载jdk-7u45-linux-x64.tar.gz,下载到主目录 下载jdk1.7版本 # wget http://download.oracle.com/otn-pub/java/jdk/7u79-b15/jdk-7u79-linux-x64.tar.gz? AuthParam=1467782282_e219161b547d26ea40c72a9a588c82b7 2、解压源码包 通过终端在/usr/local目录下新建java文件夹,命令行: sudo mkdir /usr/local/java 然后将下载到压缩包拷贝到java文件夹中,命令行: 进入jdk源码包所在目录 cp jdk-7u45-linux-x64.tar.gz /usr/local/java 然后进入java目录,命令行: cd /usr/local/java 解压压缩包,命令行: sudo tar xvf jdk-7u45-linux-x64.tar.gz 然后可以把压缩包删除,命令行: sudo rm jdk-7u45-linux-x64.tar.gz 3、设置jdk环境变量…

阿里云建立swap的两种方法

我们都知道swap是用来做虚拟内存的。虽然swap无法代替物理内存,但不可缺少,除非物理内存足够多,多到永远用不到swap…阿里云Linux主机默认是没有划分swap分区的,这就需要我们手动添加。建立swap有两种方法——1.建立分区;2.创建交换文件。这里重点介绍如何采用数据盘建立swap分区的方法,理由?运行速度:物理内存 > swap分区 > swap文件!当然,如果你的数据盘已经装了很多内容,不方便重新规划的话,也只好使用swap文件了。 一、使用数据盘建立swap分区 由于对远程linux进行无损分区比较难操作,所以建立swap分区最大的问题就是必须进行格式化,所以最好是在你使用之前进行分区。当然,如果你的数据盘内容不多,而系统盘也还有足够的空间存放的话,也是可以的,具体就是mv的操作了。 首先检查下swap情况,如图,系统默认是不划分swap的。 按照官方加载数据盘的操作,执行“fdisk -S 56 /dev/xvdb”命令,对数据盘进行分区,当然你的数据盘也有可能不是/dev/xvdb,具体请用fdisk -l核对后再执行相应的命令。然后依照提示进行操作,如图所示: 这里的数据盘只有10G,而建立swap标准一般为物理内存的两倍,故此在分区1的结束簇上填写了147(1468的1/10,目标1G的swap),至于剩下的空间,则完全分配为数据盘了。分区信息建立好之后,必须写进分区表,最后的命令就是保存和退出,请注意操作。 fdisk -l,检查下分区建立情况。嗯~不错! 分好区之后还不能用,必须建立文件系统,正如win下没有格式化的盘符会被系统识别为“未知分区”。首先建立swap分区:mkswap /dev/xvdb1;然后建立数据盘:mkfs.ext3 /dev/xvdb2。这里的xvdb1和xvdb2就是之前所建立的分区,请选择对应的分区进行操作。 分区建立到此完成。检查下内存使用情况: 啊咧~没有东西啊!那是因为你没装载swap,使用swapon命令进行装载,这下swap就出现了~万岁! 这里只是一次性装载,当你重启服务器时swap还是一样不会自动装载的,要想自动加载swap分区,就必须修改配置文件!这里的配置文件本人同样也把数据盘给添加进来了。 下面“/www”指的是挂载点,一般挂载到 “/mnt”目录 挂载完成后使用“mount -a”命令挂载新分区,然后用“df -h”命令查看,出现以下信息就说明挂载成功,可以开始使用新的分区了。 系统虽然已经可以自动加载分区了,但swap还是一样不会自动启用的,这里还必须修改/etc/rc.local文件,只要屏蔽掉“swapoff -a”这一句就ok了。 重启之后,检查内存使用~OK,swap已经自动装载启用了!检查数据盘~恩,也自动装载到对应的文件夹了。…

如何在Linux VPS和云主机增加swap虚拟内存

想在虚拟机里面安装oracle10g,发现默认的swap交换空间不满足最低要求,因为我分配的物理内存是1G,那么就按照要求需要2G的swap交换空间,默认只有1G的交换空间。添加swap交换空间的步骤如下: 第一步:确保系统中有足够的空间来用做swap交换空间,我使用的是KVM,准备在一个独立的文件系统中添加一个swap交换文件,在/opt/image中添加2G的swap交换文件 第二步:添加交换文件并设置其大小为2G,使用如下命令 # dd if=/dev/zero of=/opt/image/swap bs=1024 count=2048000 过段时间就返回如下结果: 2048000+0 records in 2048000+0 records out 2097152000 bytes (2.1 GB) copied, 272.867 seconds, 7.7 MB/s 第三步:创建(设置)交换空间,使用命令mkswap # mkswap /opt/image/swap Setting…

ip地址计算与子网划分详解

最近几天有很多的朋友反映对ip网络知识这块了解的不多,尤其是ip地址这块,希望我们能发一期关于ip地址的文章,今天我们就来一起来了解ip地址的计算与子网的划分的知识,希望通过这篇文章大家对ip地址相关知识有一个深入的了解。 IP地址分为五类 ·A类用于大型网络(能容纳网络126个,主机1677214台)·B类用于中型网络(能容纳网络16384个,主机65534台) ·C类用于小型网络(能容纳网络2097152个,主机254台) ·D类用于组播(多目的地址的发送) ·E类用于实验 另外,全零(0.0.0.0.)地址指任意网络。全1的IP地址(255.255.255.255)是当前子网的广播地址。 在因特网中,每台计算机的每个连接都有一个由授权单位分配的用于彼此区别的号码,即IP地址。IP地址采用层次结构,按照逻辑结构划分为两个部分:网络号和主机号。网络号用于识别一个逻辑网络,而主机号用于识别网络中的一台主机的一个连接。因此,IP地址的编址方式携带了明显的位置消息。 一个完整的IP地址由4个字节,即32位数字组成,为了方便用户理解和记忆,采用点分十进制标记法,中间使用符号“.”隔开不同的字节。 例如:采用32位形式的IP地址如下 00001010 00000000 00000000 00000001 采用十进制数的形式如下 10.0.0.1 各类ip地址划分 A类地址 (1) A类IP地址。由1个字节的网络地址和3个字节的主机地址,网络地址的最高位必须是“0”。 如:0XXXXXXX.XXXXXXXX.XXXXXXXX.XXXXXXXX(X代表0或1) (2)A类IP地址范围:1.0.0.1—126.255.255.254 (3)A类IP地址中的私有地址和保留地址: ① 10.X.X.X是私有地址(所谓的私有地址就是在互联网上不使用,而被用在局域网络中的地址)。 范围(10.0.0.1—10.255.255.254) ② 127.X.X.X是保留地址,用做循环测试用的。 B类地址 (1)…

使用Kubeadm安装Kubernetes

在《当Docker遇到systemd》一文中,我提到过这两天儿一直在做的一个task:使用kubeadm在Ubuntu 16.04上安装部署Kubernetes的最新发布版本-k8s 1.5.1。 年中,Docker宣布在Docker engine中集成swarmkit工具包,这一announcement在轻量级容器界引发轩然大波。毕竟开发者是懒惰的^0^,有了docker swarmkit,驱动developer去安装其他容器编排工具的动力在哪里呢?即便docker engine还不是当年那个被人们高频使用的IE浏览器。作为针对Docker公司这一市场行为的回应,容器集群管理和服务编排领先者Kubernetes在三个月后发布了Kubernetes1.4.0版本。在这个版本中K8s新增了kubeadm工具。kubeadm的使用方式有点像集成在docker engine中的swarm kit工具,旨在改善开发者在安装、调试和使用k8s时的体验,降低安装和使用门槛。理论上通过两个命令:init和join即可搭建出一套完整的Kubernetes cluster。 不过,和初入docker引擎的swarmkit一样,kubeadm目前也在active development中,也不是那么stable,因此即便在当前最新的k8s 1.5.1版本中,它仍然处于Alpha状态,官方不建议在Production环境下使用。每次执行kubeadm init时,它都会打印如下提醒日志: WARNING: kubeadm is in alpha, please do not use it for production clusters. 不过由于之前部署的k8s 1.3.7集群运行良好,这给了我们在k8s这条路上继续走下去并走好的信心。但k8s在部署和管理方面的体验的确是太繁琐了,于是我们准备试验一下kubeadm是否能带给我们超出预期的体验。之前在aliyun ubuntu…

Kubernetes集群的安全配置

使用kubernetes/cluster/kube-up.sh脚本在装有Ubuntu操作系统的bare metal上搭建的Kubernetes集群并不安全,甚至可以说是“完全不设防的”,这是因为Kubernetes集群的核心组件:kube-apiserver启用了insecure-port。insecure-port背后的api server默认完全信任访问该端口的流量,内部无任何安全机制。并且监听insecure-port的api server bind的insecure-address为0.0.0.0。也就是说任何内外部请求,都可以通过insecure-port端口任意操作Kubernetes集群。我们的平台虽小,但“裸奔”的k8s集群也并不是我们想看到的,适当的安全配置是需要的。 在本文中,我将和大家一起学习一下Kubernetes提供的安全机制,并通过安全配置调整,实现K8s集群的“有限”安全。 一、集群现状 我们先来“回顾”一下集群现状,为后续配置调整提供一个可回溯和可比对的“基线”。 1、Nodes 集群基本信息: # kubectl cluster-info Kubernetes master is running at http://10.47.136.60:8080 KubeDNS is running at http://10.47.136.60:8080/api/v1/proxy/namespaces/kube-system/services/kube-dns To further debug and diagnose cluster…

Kubernetes从Private Registry中拉取容器镜像的方法

话接上文,在《使用go-ceph管理Ceph RBD映像》一文中我们提到了,我们需要自建一个ceph rbd api service用于给我的产品控制台提供RESTful API服务接口。这个服务我也是打算放在kubernetes集群中作为一个Service运行的。这两天完成了这个服务开发,并编写完Service的Dockerfile,将镜像build, tag并push到了我们在阿里云的私有镜像库。但在通过kubectl创建这个Service时,我们遇到了 ErrImagePull、ImagePullBackOff等Pod status,通过kubectl describe pod/{MyPod}命令查看,发现下面错误提示: 23s 5s 2 {kubelet 10.57.136.60} spec.containers{rbd-rest-api} Warning Failed Failed to pull image "registry.cn-hangzhou.aliyuncs.com/xxxx/rbd-rest-api:latest": image pull failed for registry.cn-hangzhou.aliyuncs.com/xxxx/rbd-rest-api:latest, this…

使用Kubeadm安装Kubernetes-Part2

此文为《使用Kubeadm安装Kubernetes》的第二部分。文章第一部分在这里可以看到。 五、weave network for pod 经过上面那么多次尝试,结果是令人扫兴的。Weave network似乎是最后一颗救命稻草了。有了前面的铺垫,这里就不详细列出各种命令的输出细节了。Weave network也有专门的官方文档用于指导如何与kubernetes集群集成,我们主要也是参考它。 1、安装weave network add-on 在kubeadm reset后,我们重新初始化了集群。接下来我们安装weave network add-on: # kubectl apply -f https://git.io/weave-kube daemonset "weave-net" created 前面无论是Flannel还是calico,在安装pod network add-on时至少都还是顺利的。不过在Weave network这次,我们遭遇“当头棒喝”:(: # kubectl get…

当Docker遇到systemd

http://tonybai.com/2016/12/27/when-docker-meets-systemd/ 近期在做Kubernetes集群的升级的相关试验,即从原先的K8s 1.3.7版本升级到最新的K8s 1.5.1版本。k8s自1.4版本开始引入kubeadm,试图简化K8s的安装和使用门槛,提升开发者体验。但kubeadm仅支持16.04及以上的Ubuntu版本,于是我们在升级K8s集群前会遇到另外一个问题:Ubuntu 16.04已经由Upstart初始化系统换成了systemd初始化系统,Ubuntu 16.04上的Docker engine的使用和配置方法与以前在Ubuntu 14.04上将有所不同。Docker是K8s支持的容器引擎之一,也是目前最主流的容器引擎,弄清楚Docker的配置和使用也是后续用好K8s的前提之一。于是这里打算记录一下Docker与Systemd是如何相生共存的^0^。 一、Ubuntu 16.04安装Docker Aliyun目前上没有提供官方Ubuntu 16.04 ECS,最高仅支持到Ubuntu 14.04.4。因此在Aliyun ECS上用16.04需要手工upgrade到16.04(不过建议在upgrade前做个snapshot,一旦upgrade失败,好恢复)。升级后的Ubuntu环境信息如下: Ubuntu 16.04.1 LTS (GNU/Linux 4.4.0-58-generic x86_64) kubeadm文档中认为Docker 1.11.2版本与之更配哟,不过对于更新的版本似乎配合起来也没有什么大问题。我们这里安装目前可以找到的最新stable release: docker 1.12.5: # docker version Client:…